kontena-cli 1.4.0.pre6 → 1.4.0.pre7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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