kontena-cli 1.4.0.pre6 → 1.4.0.pre7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (181) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/VERSION +1 -1
  4. data/bin/kontena +1 -1
  5. data/kontena-cli.gemspec +3 -3
  6. data/lib/kontena/cli/certificate/authorize_command.rb +67 -6
  7. data/lib/kontena/cli/certificate/get_command.rb +7 -0
  8. data/lib/kontena/cli/certificate/list_command.rb +75 -0
  9. data/lib/kontena/cli/certificate/register_command.rb +13 -2
  10. data/lib/kontena/cli/certificate/request_command.rb +20 -0
  11. data/lib/kontena/cli/certificate/show_command.rb +19 -0
  12. data/lib/kontena/cli/certificate_command.rb +4 -1
  13. data/lib/kontena/cli/cloud/master/add_command.rb +1 -1
  14. data/lib/kontena/cli/common.rb +21 -33
  15. data/lib/kontena/cli/etcd/health_command.rb +21 -27
  16. data/lib/kontena/cli/helpers/exec_helper.rb +15 -6
  17. data/lib/kontena/cli/helpers/health_helper.rb +12 -0
  18. data/lib/kontena/cli/helpers/log_helper.rb +2 -2
  19. data/lib/kontena/cli/helpers/time_helper.rb +29 -0
  20. data/lib/kontena/cli/master/init_cloud_command.rb +19 -0
  21. data/lib/kontena/cli/master/list_command.rb +1 -1
  22. data/lib/kontena/cli/master/ssh_command.rb +3 -1
  23. data/lib/kontena/cli/master/use_command.rb +1 -2
  24. data/lib/kontena/cli/node_command.rb +1 -0
  25. data/lib/kontena/cli/nodes/health_command.rb +28 -13
  26. data/lib/kontena/cli/nodes/list_command.rb +19 -3
  27. data/lib/kontena/cli/nodes/show_command.rb +4 -2
  28. data/lib/kontena/cli/nodes/ssh_command.rb +5 -2
  29. data/lib/kontena/cli/nodes/update_command.rb +2 -0
  30. data/lib/kontena/cli/plugins/install_command.rb +11 -8
  31. data/lib/kontena/cli/plugins/list_command.rb +5 -3
  32. data/lib/kontena/cli/plugins/search_command.rb +4 -2
  33. data/lib/kontena/cli/plugins/show_command.rb +17 -0
  34. data/lib/kontena/cli/plugins/uninstall_command.rb +9 -13
  35. data/lib/kontena/cli/registry/create_command.rb +1 -1
  36. data/lib/kontena/cli/services/create_command.rb +6 -0
  37. data/lib/kontena/cli/services/services_helper.rb +33 -6
  38. data/lib/kontena/cli/services/update_command.rb +6 -0
  39. data/lib/kontena/cli/stacks/build_command.rb +3 -3
  40. data/lib/kontena/cli/stacks/common.rb +105 -90
  41. data/lib/kontena/cli/stacks/deploy_command.rb +7 -3
  42. data/lib/kontena/cli/stacks/install_command.rb +39 -6
  43. data/lib/kontena/cli/stacks/list_command.rb +36 -4
  44. data/lib/kontena/cli/stacks/logs_command.rb +9 -2
  45. data/lib/kontena/cli/stacks/registry/pull_command.rb +2 -2
  46. data/lib/kontena/cli/stacks/registry/push_command.rb +20 -9
  47. data/lib/kontena/cli/stacks/registry/remove_command.rb +4 -4
  48. data/lib/kontena/cli/stacks/registry/show_command.rb +4 -4
  49. data/lib/kontena/cli/stacks/remove_command.rb +27 -1
  50. data/lib/kontena/cli/stacks/service_generator.rb +12 -2
  51. data/lib/kontena/cli/stacks/show_command.rb +35 -5
  52. data/lib/kontena/cli/stacks/stack_name.rb +71 -0
  53. data/lib/kontena/cli/stacks/upgrade_command.rb +127 -14
  54. data/lib/kontena/cli/stacks/validate_command.rb +38 -10
  55. data/lib/kontena/cli/stacks/yaml/custom_validators/certificates_validator.rb +22 -0
  56. data/lib/kontena/cli/stacks/yaml/opto/prompt_resolver.rb +1 -2
  57. data/lib/kontena/cli/stacks/yaml/reader.rb +211 -185
  58. data/lib/kontena/cli/stacks/yaml/service_extender.rb +6 -12
  59. data/lib/kontena/cli/stacks/yaml/stack_file_loader.rb +97 -0
  60. data/lib/kontena/cli/stacks/yaml/stack_file_loader/file_loader.rb +41 -0
  61. data/lib/kontena/cli/stacks/yaml/stack_file_loader/registry_loader.rb +24 -0
  62. data/lib/kontena/cli/stacks/yaml/stack_file_loader/uri_loader.rb +23 -0
  63. data/lib/kontena/cli/stacks/yaml/validations.rb +16 -0
  64. data/lib/kontena/cli/stacks/yaml/validator_v3.rb +25 -8
  65. data/lib/kontena/client.rb +2 -2
  66. data/lib/kontena/command.rb +11 -0
  67. data/lib/kontena/main_command.rb +3 -1
  68. data/lib/kontena/plugin_manager.rb +11 -198
  69. data/lib/kontena/plugin_manager/cleaner.rb +33 -0
  70. data/lib/kontena/plugin_manager/common.rb +86 -0
  71. data/lib/kontena/plugin_manager/installer.rb +54 -0
  72. data/lib/kontena/plugin_manager/loader.rb +93 -0
  73. data/lib/kontena/plugin_manager/rubygems_client.rb +42 -23
  74. data/lib/kontena/plugin_manager/uninstaller.rb +34 -0
  75. data/lib/kontena/util.rb +24 -0
  76. data/lib/kontena_cli.rb +1 -0
  77. data/omnibus/config/projects/kontena.rb +7 -1
  78. data/omnibus/config/software/{kontena.rb → kontena-cli.rb} +2 -0
  79. data/spec/fixtures/api/node.json +2 -1
  80. data/spec/fixtures/stack-internal-extend.yml +6 -1
  81. data/spec/fixtures/stack-with-dependencies-dep-1-1.yml +8 -0
  82. data/spec/fixtures/stack-with-dependencies-dep-1.yml +17 -0
  83. data/spec/fixtures/stack-with-dependencies-dep-2.yml +8 -0
  84. data/spec/fixtures/stack-with-dependencies-dep-3.yml +5 -0
  85. data/spec/fixtures/stack-with-dependencies-dep_2-removed.yml +17 -0
  86. data/spec/fixtures/stack-with-dependencies-dep_3-added.yml +25 -0
  87. data/spec/fixtures/stack-with-dependencies.yml +22 -0
  88. data/spec/fixtures/stack-with-variables.yml +3 -0
  89. data/spec/kontena/cli/etcd/health_command_spec.rb +45 -33
  90. data/spec/kontena/cli/helpers/exec_helper_spec.rb +2 -1
  91. data/spec/kontena/cli/master/init_cloud_command_spec.rb +14 -0
  92. data/spec/kontena/cli/nodes/health_command_spec.rb +74 -10
  93. data/spec/kontena/cli/nodes/list_command_spec.rb +381 -232
  94. data/spec/kontena/cli/nodes/show_command_spec.rb +31 -0
  95. data/spec/kontena/cli/nodes/ssh_command_spec.rb +18 -3
  96. data/spec/kontena/cli/plugins/install_command_spec.rb +1 -1
  97. data/spec/kontena/cli/stacks/build_command_spec.rb +6 -12
  98. data/spec/kontena/cli/stacks/common_spec.rb +42 -69
  99. data/spec/kontena/cli/stacks/install_command_spec.rb +57 -31
  100. data/spec/kontena/cli/stacks/list_command_spec.rb +44 -0
  101. data/spec/kontena/cli/stacks/logs_command_spec.rb +12 -1
  102. data/spec/kontena/cli/stacks/remove_command_spec.rb +39 -0
  103. data/spec/kontena/cli/stacks/show_command_spec.rb +16 -0
  104. data/spec/kontena/cli/stacks/stack_name_spec.rb +21 -0
  105. data/spec/kontena/cli/stacks/upgrade_command_spec.rb +73 -56
  106. data/spec/kontena/cli/stacks/validate_command_spec.rb +81 -0
  107. data/spec/kontena/cli/stacks/yaml/custom_validators/affinities_validator_spec.rb +22 -0
  108. data/spec/kontena/cli/stacks/yaml/reader_spec.rb +173 -169
  109. data/spec/kontena/cli/stacks/yaml/service_extender_spec.rb +12 -3
  110. data/spec/kontena/cli/stacks/yaml/stack_file_loader/file_loader_spec.rb +47 -0
  111. data/spec/kontena/cli/stacks/yaml/stack_file_loader/registry_loader_spec.rb +53 -0
  112. data/spec/kontena/cli/stacks/yaml/stack_file_loader/uri_loader_spec.rb +53 -0
  113. data/spec/kontena/cli/stacks/yaml/stack_file_loader_spec.rb +104 -0
  114. data/spec/kontena/cli/stacks/yaml/validator_v3_spec.rb +19 -0
  115. data/spec/kontena/plugin_manager/cleaner_spec.rb +20 -0
  116. data/spec/kontena/plugin_manager/common_spec.rb +39 -0
  117. data/spec/kontena/plugin_manager/installer_spec.rb +50 -0
  118. data/spec/kontena/plugin_manager/loader_spec.rb +5 -0
  119. data/spec/kontena/plugin_manager/rubygems_client_spec.rb +11 -25
  120. data/spec/kontena/plugin_manager/uninstaller_spec.rb +19 -0
  121. data/spec/kontena/plugin_manager_spec.rb +7 -7
  122. metadata +64 -97
  123. data/lib/kontena/cli/app_command.rb +0 -22
  124. data/lib/kontena/cli/apps/build_command.rb +0 -28
  125. data/lib/kontena/cli/apps/common.rb +0 -172
  126. data/lib/kontena/cli/apps/config_command.rb +0 -25
  127. data/lib/kontena/cli/apps/deploy_command.rb +0 -137
  128. data/lib/kontena/cli/apps/docker_compose_generator.rb +0 -61
  129. data/lib/kontena/cli/apps/docker_helper.rb +0 -80
  130. data/lib/kontena/cli/apps/dockerfile_generator.rb +0 -16
  131. data/lib/kontena/cli/apps/init_command.rb +0 -89
  132. data/lib/kontena/cli/apps/kontena_yml_generator.rb +0 -105
  133. data/lib/kontena/cli/apps/list_command.rb +0 -59
  134. data/lib/kontena/cli/apps/logs_command.rb +0 -37
  135. data/lib/kontena/cli/apps/monitor_command.rb +0 -93
  136. data/lib/kontena/cli/apps/remove_command.rb +0 -74
  137. data/lib/kontena/cli/apps/restart_command.rb +0 -39
  138. data/lib/kontena/cli/apps/scale_command.rb +0 -33
  139. data/lib/kontena/cli/apps/service_generator.rb +0 -114
  140. data/lib/kontena/cli/apps/service_generator_v2.rb +0 -27
  141. data/lib/kontena/cli/apps/show_command.rb +0 -23
  142. data/lib/kontena/cli/apps/start_command.rb +0 -40
  143. data/lib/kontena/cli/apps/stop_command.rb +0 -40
  144. data/lib/kontena/cli/apps/yaml/custom_validators/affinities_validator.rb +0 -19
  145. data/lib/kontena/cli/apps/yaml/custom_validators/build_validator.rb +0 -22
  146. data/lib/kontena/cli/apps/yaml/custom_validators/extends_validator.rb +0 -20
  147. data/lib/kontena/cli/apps/yaml/custom_validators/hooks_validator.rb +0 -54
  148. data/lib/kontena/cli/apps/yaml/custom_validators/secrets_validator.rb +0 -22
  149. data/lib/kontena/cli/apps/yaml/reader.rb +0 -213
  150. data/lib/kontena/cli/apps/yaml/service_extender.rb +0 -77
  151. data/lib/kontena/cli/apps/yaml/validations.rb +0 -71
  152. data/lib/kontena/cli/apps/yaml/validator.rb +0 -38
  153. data/lib/kontena/cli/apps/yaml/validator_v2.rb +0 -53
  154. data/spec/fixtures/app.json +0 -42
  155. data/spec/fixtures/health.yml +0 -26
  156. data/spec/fixtures/kontena-build.yml +0 -16
  157. data/spec/fixtures/kontena-internal-extend.yml +0 -8
  158. data/spec/fixtures/kontena-invalid.yml +0 -4
  159. data/spec/fixtures/kontena-with-env-file.yml +0 -18
  160. data/spec/fixtures/kontena-with-variables.yml +0 -19
  161. data/spec/fixtures/kontena.yml +0 -17
  162. data/spec/fixtures/kontena_build_v2.yml +0 -26
  163. data/spec/fixtures/kontena_numeric_version.yml +0 -9
  164. data/spec/fixtures/kontena_v2.yml +0 -35
  165. data/spec/fixtures/mysql.yml +0 -3
  166. data/spec/fixtures/wordpress-scaled.yml +0 -3
  167. data/spec/fixtures/wordpress.yml +0 -2
  168. data/spec/kontena/cli/app/build_command_spec.rb +0 -55
  169. data/spec/kontena/cli/app/common_spec.rb +0 -110
  170. data/spec/kontena/cli/app/config_command_spec.rb +0 -78
  171. data/spec/kontena/cli/app/deploy_command_spec.rb +0 -217
  172. data/spec/kontena/cli/app/docker_helper_spec.rb +0 -155
  173. data/spec/kontena/cli/app/init_command_spec.rb +0 -109
  174. data/spec/kontena/cli/app/logs_command_spec.rb +0 -131
  175. data/spec/kontena/cli/app/scale_spec.rb +0 -51
  176. data/spec/kontena/cli/app/service_generator_spec.rb +0 -384
  177. data/spec/kontena/cli/app/service_generator_v2_spec.rb +0 -73
  178. data/spec/kontena/cli/app/yaml/reader_spec.rb +0 -457
  179. data/spec/kontena/cli/app/yaml/service_extender_spec.rb +0 -127
  180. data/spec/kontena/cli/app/yaml/validator_spec.rb +0 -380
  181. data/spec/kontena/cli/app/yaml/validator_v2_spec.rb +0 -301
@@ -1,4 +1,5 @@
1
1
  name "kontena-cli"
2
+ license "Apache 2.0"
2
3
  default_version File.read('../VERSION').strip
3
4
  source path: "./wrappers"
4
5
  dependency "ruby"
@@ -10,5 +11,6 @@ build do
10
11
  gem "install rb-readline -v 0.5.4 --no-ri --no-doc"
11
12
  gem "install nokogiri -v 1.6.8 --no-ri --no-doc"
12
13
  gem "install kontena-cli -v #{default_version} --no-ri --no-doc"
14
+ gem "install kontena-plugin-cloud --no-ri --no-doc"
13
15
  copy "sh/kontena", "#{install_dir}/bin/kontena"
14
16
  end
@@ -89,5 +89,6 @@
89
89
  "initial_size" : 1
90
90
  },
91
91
  "mem_total" : 1045032960,
92
- "connected" : true
92
+ "connected" : true,
93
+ "availability": "active"
93
94
  }
@@ -4,8 +4,13 @@ services:
4
4
  base:
5
5
  stateful: true
6
6
  instances: 2
7
+ image: base
7
8
  deploy:
8
9
  strategy: ha
10
+ environment:
11
+ - "TEST1=test1"
12
+ - "TEST2=test2"
9
13
  app:
10
14
  extends: base
11
- stateful: true
15
+ environment:
16
+ - "TEST2=changed"
@@ -0,0 +1,8 @@
1
+ stack: user/depstack1child1child1
2
+ version: 0.0.1
3
+ variables:
4
+ dep_var:
5
+ type: integer
6
+ services:
7
+ monitor:
8
+ image: "image:${dep_var}"
@@ -0,0 +1,17 @@
1
+ stack: user/depstack1child1
2
+ version: 0.0.1
3
+ variables:
4
+ test_var:
5
+ type: string
6
+ from:
7
+ random_string:
8
+ length: 16
9
+ charset: hex
10
+ depends:
11
+ dep_1:
12
+ stack: stack-with-dependencies-dep-1-1.yml
13
+ variables:
14
+ dep_var: 2
15
+ services:
16
+ db:
17
+ image: "$test_var"
@@ -0,0 +1,8 @@
1
+ stack: user/depstack1child2
2
+ version: 0.0.1
3
+ variables:
4
+ dep_var:
5
+ type: integer
6
+ services:
7
+ cache:
8
+ image: "image:$dep_var"
@@ -0,0 +1,5 @@
1
+ stack: user/depstack1child3
2
+ version: 0.0.1
3
+ services:
4
+ logger:
5
+ image: logger
@@ -0,0 +1,17 @@
1
+ stack: user/depstack1
2
+ version: 0.0.1
3
+ variables:
4
+ test_var:
5
+ type: string
6
+ from:
7
+ random_string:
8
+ length: 16
9
+ charset: hex
10
+ depends:
11
+ dep_1:
12
+ stack: stack-with-dependencies-dep-1.yml
13
+ services:
14
+ app:
15
+ image: "${test_var}"
16
+ environment:
17
+ - "TEST=${dep_1}"
@@ -0,0 +1,25 @@
1
+ stack: user/depstack1
2
+ version: 0.0.1
3
+ variables:
4
+ test_var:
5
+ type: string
6
+ from:
7
+ random_string:
8
+ length: 16
9
+ charset: hex
10
+ depends:
11
+ dep_1:
12
+ stack: stack-with-dependencies-dep-1.yml
13
+ dep_2:
14
+ stack: stack-with-dependencies-dep-2.yml
15
+ variables:
16
+ dep_var: 1
17
+ dep_3:
18
+ stack: stack-with-dependencies-dep-3.yml
19
+ services:
20
+ app:
21
+ image: "${test_var}"
22
+ environment:
23
+ - "TEST=${dep_1}"
24
+ - "TEST2=${dep_2}"
25
+
@@ -0,0 +1,22 @@
1
+ stack: user/depstack1
2
+ version: 0.0.1
3
+ variables:
4
+ test_var:
5
+ type: string
6
+ from:
7
+ random_string:
8
+ length: 16
9
+ charset: hex
10
+ depends:
11
+ dep_1:
12
+ stack: stack-with-dependencies-dep-1.yml
13
+ dep_2:
14
+ stack: stack-with-dependencies-dep-2.yml
15
+ variables:
16
+ dep_var: 1
17
+ services:
18
+ app:
19
+ image: "${test_var}"
20
+ environment:
21
+ - "TEST=${dep_1}"
22
+ - "TEST2=${dep_2}"
@@ -42,6 +42,9 @@ services:
42
42
  stateful: true
43
43
  environment:
44
44
  - WORDPRESS_DB_PASSWORD=${STACK}_secret
45
+ - STACK=${STACK}
46
+ - GRID=${GRID}
47
+ - PLATFORM=${PLATFORM}
45
48
  secrets:
46
49
  - secret: WP_ADMIN_PASSWORD
47
50
  name: WORDPRESS_PASSWORD
@@ -8,26 +8,14 @@ describe Kontena::Cli::Etcd::HealthCommand do
8
8
  allow(subject).to receive(:health_icon) {|health| health.inspect }
9
9
  end
10
10
 
11
- let :node1_health do
11
+ let :node1_errors do
12
12
  {
13
- "id" => 'test-grid/node-1',
14
- "connected" => false,
15
- "name" => "node-1",
16
- 'etcd_health' => {
17
- 'health' => nil,
18
- 'error' => nil,
19
- },
13
+ 'connection' => "Websocket disconnected at 2017-08-16 14:50:46 UTC with code 1006: ",
20
14
  }
21
15
  end
22
- let :node2_health do
16
+ let :node2_errors do
23
17
  {
24
- "id" => 'test-grid/node-2',
25
- "name" => "node-2",
26
- "connected" => true,
27
- 'etcd_health' => {
28
- 'health' => nil,
29
- 'error' => "timeout",
30
- },
18
+ 'etcd_health' => "RPC timeout",
31
19
  }
32
20
  end
33
21
  let :node3_health do
@@ -46,6 +34,17 @@ describe Kontena::Cli::Etcd::HealthCommand do
46
34
  "id" => 'test-grid/node-4',
47
35
  "name" => "node-4",
48
36
  "connected" => true,
37
+ 'etcd_health' => {
38
+ 'health' => nil,
39
+ 'error' => "proxy: zero endpoints currently available",
40
+ },
41
+ }
42
+ end
43
+ let :node5_health do
44
+ {
45
+ "id" => 'test-grid/node-5',
46
+ "name" => "node-5",
47
+ "connected" => true,
49
48
  'etcd_health' => {
50
49
  'health' => true,
51
50
  'error' => nil,
@@ -54,24 +53,25 @@ describe Kontena::Cli::Etcd::HealthCommand do
54
53
  end
55
54
 
56
55
  before do
57
- allow(client).to receive(:get).with('nodes/test-grid/node-1/health').and_return(node1_health)
58
- allow(client).to receive(:get).with('nodes/test-grid/node-2/health').and_return(node2_health)
56
+ allow(client).to receive(:get).with('nodes/test-grid/node-1/health').and_raise(Kontena::Errors::StandardErrorHash.new(422, "", node1_errors))
57
+ allow(client).to receive(:get).with('nodes/test-grid/node-2/health').and_raise(Kontena::Errors::StandardErrorHash.new(422, "", node2_errors))
59
58
  allow(client).to receive(:get).with('nodes/test-grid/node-3/health').and_return(node3_health)
60
59
  allow(client).to receive(:get).with('nodes/test-grid/node-4/health').and_return(node4_health)
60
+ allow(client).to receive(:get).with('nodes/test-grid/node-5/health').and_return(node5_health)
61
61
  end
62
62
 
63
63
  context "For an offline node-1" do
64
64
  it "shows offline and returns false" do
65
65
  expect{subject.run(['node-1'])}.to exit_with_error.and output_lines [
66
- ":offline Node node-1 is offline",
66
+ ":offline Node test-grid/node-1 connection error: Websocket disconnected at 2017-08-16 14:50:46 UTC with code 1006: ",
67
67
  ]
68
68
  end
69
69
  end
70
70
 
71
- context "For a node-2 with health errors" do
71
+ context "For a node-2 with RPC errors" do
72
72
  it "shows errored and returns false" do
73
73
  expect{subject.run(['node-2'])}.to exit_with_error.and output_lines [
74
- ":error Node node-2 is unhealthy: timeout",
74
+ ":offline Node test-grid/node-2 etcd_health error: RPC timeout",
75
75
  ]
76
76
  end
77
77
  end
@@ -79,15 +79,23 @@ describe Kontena::Cli::Etcd::HealthCommand do
79
79
  context "For a node-3 that returns health=false" do
80
80
  it "shows unhealthy and returns false" do
81
81
  expect{subject.run(['node-3'])}.to exit_with_error.and output_lines [
82
- ":error Node node-3 is unhealthy",
82
+ ":error Node node-3 etcd is unhealthy",
83
+ ]
84
+ end
85
+ end
86
+
87
+ context "For an unhealthy node-4" do
88
+ it "shows unhealthy and returns false" do
89
+ expect{subject.run(['node-4'])}.to exit_with_error.and output_lines [
90
+ ":error Node node-4 etcd is unhealthy: proxy: zero endpoints currently available",
83
91
  ]
84
92
  end
85
93
  end
86
94
 
87
- context "For a healthy node-4" do
95
+ context "For a healthy node-5" do
88
96
  it "shows healthy and returns true" do
89
- expect{subject.run(['node-4'])}.to output_lines [
90
- ":ok Node node-4 is healthy",
97
+ expect{subject.run(['node-5'])}.to output_lines [
98
+ ":ok Node node-5 etcd is healthy",
91
99
  ]
92
100
  end
93
101
  end
@@ -107,6 +115,9 @@ describe Kontena::Cli::Etcd::HealthCommand do
107
115
  {
108
116
  'id' => 'test-grid/node-4',
109
117
  },
118
+ {
119
+ 'id' => 'test-grid/node-5',
120
+ },
110
121
  ]
111
122
  end
112
123
 
@@ -118,10 +129,11 @@ describe Kontena::Cli::Etcd::HealthCommand do
118
129
 
119
130
  it 'shows all nodes and exits with an error' do
120
131
  expect{subject.run([])}.to exit_with_error.and output_lines [
121
- ":offline Node node-1 is offline",
122
- ":error Node node-2 is unhealthy: timeout",
123
- ":error Node node-3 is unhealthy",
124
- ":ok Node node-4 is healthy",
132
+ ":offline Node test-grid/node-1 connection error: Websocket disconnected at 2017-08-16 14:50:46 UTC with code 1006: ",
133
+ ":offline Node test-grid/node-2 etcd_health error: RPC timeout",
134
+ ":error Node node-3 etcd is unhealthy",
135
+ ":error Node node-4 etcd is unhealthy: proxy: zero endpoints currently available",
136
+ ":ok Node node-5 etcd is healthy",
125
137
  ]
126
138
  end
127
139
  end
@@ -130,10 +142,10 @@ describe Kontena::Cli::Etcd::HealthCommand do
130
142
  let :grid_nodes do
131
143
  [
132
144
  {
133
- 'id' => 'test-grid/node-4',
145
+ 'id' => 'test-grid/node-5',
134
146
  },
135
147
  {
136
- 'id' => 'test-grid/node-4',
148
+ 'id' => 'test-grid/node-5',
137
149
  },
138
150
  ]
139
151
  end
@@ -146,8 +158,8 @@ describe Kontena::Cli::Etcd::HealthCommand do
146
158
 
147
159
  it 'shows nodes as healthy anddoes not and exit with an error' do
148
160
  expect{subject.run([])}.to output_lines [
149
- ":ok Node node-4 is healthy",
150
- ":ok Node node-4 is healthy",
161
+ ":ok Node node-5 etcd is healthy",
162
+ ":ok Node node-5 etcd is healthy",
151
163
  ]
152
164
  end
153
165
  end
@@ -235,7 +235,8 @@ describe Kontena::Cli::Helpers::ExecHelper do
235
235
 
236
236
  it 'connects and sends messages from stdin' do
237
237
  stdin_eol = false
238
-
238
+ allow(IO.console).to receive(:winsize).and_return([100, 100])
239
+ expect(websocket_client).to receive(:send).once.with('{"tty_size":{"width":100,"height":100}}')
239
240
  expect(websocket_client).to receive(:send).once.with('{"cmd":["test-tty"]}')
240
241
 
241
242
  expect(subject).to receive(:read_stdin).once.with(tty: true) do |&block|
@@ -20,8 +20,22 @@ describe Kontena::Cli::Master::InitCloudCommand do
20
20
  end
21
21
 
22
22
  it 'runs the invite self after deploy callback' do
23
+ allow(subject).to receive(:already_cloud_enabled?).and_return(false)
23
24
  expect(Kontena).to receive(:run!).with(%w(cloud master add --current --force)).and_return(true)
24
25
  expect_any_instance_of(Kontena::Callbacks::InviteSelfAfterDeploy).to receive(:after).and_return(true)
25
26
  subject.run(['--force'])
26
27
  end
28
+
29
+ it 'exits with error if master is already registered to use cloud' do
30
+ expect(subject.cloud_client).to receive(:get).with('user/masters').and_return(
31
+ 'data' => [
32
+ { 'attributes' => { 'client-id' => 'abc123', 'name' => 'testmaster' } },
33
+ { 'attributes' => { 'client-id' => 'def234', 'name' => 'foo' } },
34
+ ]
35
+ )
36
+ expect(subject.client).to receive(:get).with('config').and_return(
37
+ 'oauth2.client_id' => 'abc123'
38
+ )
39
+ expect{subject.run(['--force'])}.to exit_with_error.and output(/already registered.+?testmaster/).to_stderr
40
+ end
27
41
  end
@@ -8,40 +8,104 @@ describe Kontena::Cli::Nodes::HealthCommand do
8
8
  allow(subject).to receive(:health_icon) {|health| health.inspect }
9
9
  end
10
10
 
11
- before do
12
- allow(client).to receive(:get).with('nodes/test-grid/node').and_return(node)
13
- end
14
-
15
11
  context "for an online node" do
16
- let :node do
12
+ let :node_health do
17
13
  {
18
14
  "name" => "node",
19
15
  "node_number" => 4,
20
16
  "initial_member" => false,
17
+ 'status' => 'online',
18
+ 'connected_at' => (Time.now - 50.0).to_s,
21
19
  "connected" => true,
20
+ 'etcd_health' => {
21
+ 'health' => true,
22
+ 'error' => nil,
23
+ },
22
24
  }
23
25
  end
24
26
 
27
+ before do
28
+ allow(client).to receive(:get).with('nodes/test-grid/node/health').and_return(node_health)
29
+ end
30
+
25
31
  it "outputs ok" do
26
32
  expect{subject.run(['node'])}.to output_lines [
27
- ":ok Node is online",
33
+ ":ok Node is online for 50s",
34
+ ":ok Node node etcd is healthy",
28
35
  ]
29
36
  end
30
37
  end
31
38
 
32
39
  context "for an offline node" do
33
- let :node do
40
+ let :node_errors do
41
+ {
42
+ 'connection' => "Websocket disconnected at 2017-07-12 12:28:10 UTC with code 4030: ping timeout after 5.00s",
43
+ }
44
+ end
45
+
46
+ before do
47
+ allow(client).to receive(:get).with('nodes/test-grid/node/health').and_raise(Kontena::Errors::StandardErrorHash.new(422, "", node_errors))
48
+ end
49
+
50
+ it "fails as error" do
51
+ expect{subject.run(['node'])}.to exit_with_error.and output_lines [
52
+ ":offline Node test-grid/node connection error: Websocket disconnected at 2017-07-12 12:28:10 UTC with code 4030: ping timeout after 5.00s",
53
+ ]
54
+ end
55
+ end
56
+
57
+ context "for an online initial node in an ok grid" do
58
+ let :node_health do
59
+ {
60
+ "name" => "node",
61
+ "node_number" => 1,
62
+ "initial_member" => true,
63
+ 'status' => 'online',
64
+ 'connected_at' => (Time.now - 50.0).to_s,
65
+ "connected" => true,
66
+ 'etcd_health' => {
67
+ 'health' => true,
68
+ 'error' => nil,
69
+ },
70
+ }
71
+ end
72
+
73
+ before do
74
+ allow(client).to receive(:get).with('nodes/test-grid/node/health').and_return(node_health)
75
+ end
76
+
77
+ it "outputs ok" do
78
+ expect{subject.run(['node'])}.to output_lines [
79
+ ":ok Node is online for 50s",
80
+ ":ok Node node etcd is healthy",
81
+ ]
82
+ end
83
+ end
84
+
85
+ context "for an online node in an grid with broken etcd" do
86
+ let :node_health do
34
87
  {
35
88
  "name" => "node",
36
89
  "node_number" => 4,
37
90
  "initial_member" => false,
38
- "connected" => false,
91
+ 'status' => 'online',
92
+ 'connected_at' => (Time.now - 50.0).to_s,
93
+ "connected" => true,
94
+ 'etcd_health' => {
95
+ 'health' => false,
96
+ 'error' => "no peers reachable",
97
+ },
39
98
  }
40
99
  end
41
100
 
42
- it "fails as error" do
101
+ before do
102
+ allow(client).to receive(:get).with('nodes/test-grid/node/health').and_return(node_health)
103
+ end
104
+
105
+ it "fails with etcd errro" do
43
106
  expect{subject.run(['node'])}.to exit_with_error.and output_lines [
44
- ":offline Node is offline",
107
+ ":ok Node is online for 50s",
108
+ ":error Node node etcd is unhealthy: no peers reachable",
45
109
  ]
46
110
  end
47
111
  end