central-cli 0.6.3

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 (259) hide show
  1. checksums.yaml +7 -0
  2. data/.dockerignore +3 -0
  3. data/.gitignore +15 -0
  4. data/.rspec +6 -0
  5. data/.rubocop.yml +5 -0
  6. data/Dockerfile +15 -0
  7. data/Gemfile +10 -0
  8. data/LICENSE +191 -0
  9. data/README.md +39 -0
  10. data/Rakefile +9 -0
  11. data/VERSION +1 -0
  12. data/bin/cm +85 -0
  13. data/central-cli.gemspec +35 -0
  14. data/central-docker.sh +6 -0
  15. data/lib/central/cli/app_command.rb +29 -0
  16. data/lib/central/cli/apps/build_command.rb +24 -0
  17. data/lib/central/cli/apps/central_yml_generator.rb +88 -0
  18. data/lib/central/cli/apps/common.rb +166 -0
  19. data/lib/central/cli/apps/deploy_command.rb +191 -0
  20. data/lib/central/cli/apps/docker_compose_generator.rb +48 -0
  21. data/lib/central/cli/apps/docker_helper.rb +85 -0
  22. data/lib/central/cli/apps/dockerfile_generator.rb +15 -0
  23. data/lib/central/cli/apps/init_command.rb +91 -0
  24. data/lib/central/cli/apps/list_command.rb +68 -0
  25. data/lib/central/cli/apps/logs_command.rb +76 -0
  26. data/lib/central/cli/apps/monitor_command.rb +93 -0
  27. data/lib/central/cli/apps/remove_command.rb +80 -0
  28. data/lib/central/cli/apps/restart_command.rb +38 -0
  29. data/lib/central/cli/apps/scale_command.rb +31 -0
  30. data/lib/central/cli/apps/show_command.rb +23 -0
  31. data/lib/central/cli/apps/start_command.rb +39 -0
  32. data/lib/central/cli/apps/stop_command.rb +39 -0
  33. data/lib/central/cli/auth/aws/create_command.rb +34 -0
  34. data/lib/central/cli/auth/aws_command.rb +7 -0
  35. data/lib/central/cli/auth/list_command.rb +28 -0
  36. data/lib/central/cli/auth_command.rb +9 -0
  37. data/lib/central/cli/bytes_helper.rb +38 -0
  38. data/lib/central/cli/common.rb +148 -0
  39. data/lib/central/cli/container_command.rb +10 -0
  40. data/lib/central/cli/containers/exec_command.rb +21 -0
  41. data/lib/central/cli/containers/inspect_command.rb +22 -0
  42. data/lib/central/cli/etcd/common.rb +7 -0
  43. data/lib/central/cli/etcd/get_command.rb +26 -0
  44. data/lib/central/cli/etcd/list_command.rb +31 -0
  45. data/lib/central/cli/etcd/mkdir_command.rb +21 -0
  46. data/lib/central/cli/etcd/remove_command.rb +25 -0
  47. data/lib/central/cli/etcd/set_command.rb +22 -0
  48. data/lib/central/cli/etcd_command.rb +16 -0
  49. data/lib/central/cli/external_registries/add_command.rb +21 -0
  50. data/lib/central/cli/external_registries/delete_command.rb +15 -0
  51. data/lib/central/cli/external_registries/list_command.rb +27 -0
  52. data/lib/central/cli/external_registries/remove_command.rb +13 -0
  53. data/lib/central/cli/external_registry_command.rb +14 -0
  54. data/lib/central/cli/login_command.rb +121 -0
  55. data/lib/central/cli/logout_command.rb +7 -0
  56. data/lib/central/cli/master/aws/create_command.rb +41 -0
  57. data/lib/central/cli/master/aws_command.rb +7 -0
  58. data/lib/central/cli/master/azure/create_command.rb +39 -0
  59. data/lib/central/cli/master/azure_command.rb +11 -0
  60. data/lib/central/cli/master/digital_ocean/create_command.rb +35 -0
  61. data/lib/central/cli/master/digital_ocean_command.rb +11 -0
  62. data/lib/central/cli/master/list_command.rb +28 -0
  63. data/lib/central/cli/master/use_command.rb +34 -0
  64. data/lib/central/cli/master/users/add_role_command.rb +26 -0
  65. data/lib/central/cli/master/users/invite_command.rb +24 -0
  66. data/lib/central/cli/master/users/list_command.rb +18 -0
  67. data/lib/central/cli/master/users/remove_command.rb +22 -0
  68. data/lib/central/cli/master/users/remove_role_command.rb +25 -0
  69. data/lib/central/cli/master/users_command.rb +15 -0
  70. data/lib/central/cli/master/vagrant/create_command.rb +25 -0
  71. data/lib/central/cli/master/vagrant/restart_command.rb +20 -0
  72. data/lib/central/cli/master/vagrant/ssh_command.rb +15 -0
  73. data/lib/central/cli/master/vagrant/start_command.rb +20 -0
  74. data/lib/central/cli/master/vagrant/stop_command.rb +20 -0
  75. data/lib/central/cli/master/vagrant/terminate_command.rb +13 -0
  76. data/lib/central/cli/master/vagrant_command.rb +21 -0
  77. data/lib/central/cli/master_command.rb +19 -0
  78. data/lib/central/cli/node_command.rb +30 -0
  79. data/lib/central/cli/nodes/add_label_command.rb +19 -0
  80. data/lib/central/cli/nodes/aws/create_command.rb +40 -0
  81. data/lib/central/cli/nodes/aws/restart_command.rb +29 -0
  82. data/lib/central/cli/nodes/aws/terminate_command.rb +21 -0
  83. data/lib/central/cli/nodes/aws_command.rb +14 -0
  84. data/lib/central/cli/nodes/azure/create_command.rb +40 -0
  85. data/lib/central/cli/nodes/azure/restart_command.rb +31 -0
  86. data/lib/central/cli/nodes/azure/terminate_command.rb +21 -0
  87. data/lib/central/cli/nodes/azure_command.rb +14 -0
  88. data/lib/central/cli/nodes/digital_ocean/create_command.rb +32 -0
  89. data/lib/central/cli/nodes/digital_ocean/restart_command.rb +27 -0
  90. data/lib/central/cli/nodes/digital_ocean/terminate_command.rb +19 -0
  91. data/lib/central/cli/nodes/digital_ocean_command.rb +14 -0
  92. data/lib/central/cli/nodes/label_command.rb +12 -0
  93. data/lib/central/cli/nodes/labels/add_command.rb +19 -0
  94. data/lib/central/cli/nodes/labels/remove_command.rb +23 -0
  95. data/lib/central/cli/nodes/list_command.rb +62 -0
  96. data/lib/central/cli/nodes/remove_command.rb +16 -0
  97. data/lib/central/cli/nodes/remove_label_command.rb +23 -0
  98. data/lib/central/cli/nodes/show_command.rb +49 -0
  99. data/lib/central/cli/nodes/ssh_command.rb +31 -0
  100. data/lib/central/cli/nodes/update_command.rb +20 -0
  101. data/lib/central/cli/nodes/vagrant/create_command.rb +27 -0
  102. data/lib/central/cli/nodes/vagrant/restart_command.rb +26 -0
  103. data/lib/central/cli/nodes/vagrant/ssh_command.rb +21 -0
  104. data/lib/central/cli/nodes/vagrant/start_command.rb +26 -0
  105. data/lib/central/cli/nodes/vagrant/stop_command.rb +26 -0
  106. data/lib/central/cli/nodes/vagrant/terminate_command.rb +17 -0
  107. data/lib/central/cli/nodes/vagrant_command.rb +20 -0
  108. data/lib/central/cli/register_command.rb +21 -0
  109. data/lib/central/cli/registry/create_command.rb +144 -0
  110. data/lib/central/cli/registry/delete_command.rb +22 -0
  111. data/lib/central/cli/registry/remove_command.rb +19 -0
  112. data/lib/central/cli/registry_command.rb +11 -0
  113. data/lib/central/cli/service_command.rb +49 -0
  114. data/lib/central/cli/services/add_env_command.rb +19 -0
  115. data/lib/central/cli/services/add_secret_command.rb +24 -0
  116. data/lib/central/cli/services/container_command.rb +8 -0
  117. data/lib/central/cli/services/containers_command.rb +32 -0
  118. data/lib/central/cli/services/create_command.rb +90 -0
  119. data/lib/central/cli/services/delete_command.rb +19 -0
  120. data/lib/central/cli/services/deploy_command.rb +21 -0
  121. data/lib/central/cli/services/env_command.rb +11 -0
  122. data/lib/central/cli/services/envs/add_command.rb +19 -0
  123. data/lib/central/cli/services/envs/list_command.rb +20 -0
  124. data/lib/central/cli/services/envs/remove_command.rb +18 -0
  125. data/lib/central/cli/services/envs_command.rb +20 -0
  126. data/lib/central/cli/services/link_command.rb +26 -0
  127. data/lib/central/cli/services/list_command.rb +42 -0
  128. data/lib/central/cli/services/logs_command.rb +57 -0
  129. data/lib/central/cli/services/monitor_command.rb +58 -0
  130. data/lib/central/cli/services/remove_command.rb +17 -0
  131. data/lib/central/cli/services/remove_env_command.rb +18 -0
  132. data/lib/central/cli/services/remove_secret_command.rb +28 -0
  133. data/lib/central/cli/services/restart_command.rb +17 -0
  134. data/lib/central/cli/services/scale_command.rb +17 -0
  135. data/lib/central/cli/services/secret_command.rb +9 -0
  136. data/lib/central/cli/services/secrets/link_command.rb +24 -0
  137. data/lib/central/cli/services/secrets/unlink_command.rb +28 -0
  138. data/lib/central/cli/services/services_helper.rb +360 -0
  139. data/lib/central/cli/services/show_command.rb +18 -0
  140. data/lib/central/cli/services/start_command.rb +17 -0
  141. data/lib/central/cli/services/stats_command.rb +74 -0
  142. data/lib/central/cli/services/stop_command.rb +17 -0
  143. data/lib/central/cli/services/unlink_command.rb +25 -0
  144. data/lib/central/cli/services/update_command.rb +78 -0
  145. data/lib/central/cli/stack_command.rb +32 -0
  146. data/lib/central/cli/stack_options.rb +11 -0
  147. data/lib/central/cli/stacks/add_user_command.rb +18 -0
  148. data/lib/central/cli/stacks/audit_log_command.rb +21 -0
  149. data/lib/central/cli/stacks/cloud_config_command.rb +41 -0
  150. data/lib/central/cli/stacks/common.rb +95 -0
  151. data/lib/central/cli/stacks/create_command.rb +26 -0
  152. data/lib/central/cli/stacks/current_command.rb +25 -0
  153. data/lib/central/cli/stacks/env_command.rb +32 -0
  154. data/lib/central/cli/stacks/list_command.rb +35 -0
  155. data/lib/central/cli/stacks/list_users_command.rb +26 -0
  156. data/lib/central/cli/stacks/logs_command.rb +81 -0
  157. data/lib/central/cli/stacks/remove_command.rb +26 -0
  158. data/lib/central/cli/stacks/remove_user_command.rb +17 -0
  159. data/lib/central/cli/stacks/show_command.rb +19 -0
  160. data/lib/central/cli/stacks/trusted_subnets/add_command.rb +16 -0
  161. data/lib/central/cli/stacks/trusted_subnets/list_command.rb +17 -0
  162. data/lib/central/cli/stacks/trusted_subnets/remove_command.rb +20 -0
  163. data/lib/central/cli/stacks/update_command.rb +27 -0
  164. data/lib/central/cli/stacks/use_command.rb +21 -0
  165. data/lib/central/cli/stacks/user_command.rb +11 -0
  166. data/lib/central/cli/stacks/users/add_command.rb +18 -0
  167. data/lib/central/cli/stacks/users/list_command.rb +18 -0
  168. data/lib/central/cli/stacks/users/remove_command.rb +17 -0
  169. data/lib/central/cli/user/forgot_password_command.rb +16 -0
  170. data/lib/central/cli/user/reset_password_command.rb +21 -0
  171. data/lib/central/cli/user/verify_command.rb +22 -0
  172. data/lib/central/cli/user_command.rb +12 -0
  173. data/lib/central/cli/vault/list_command.rb +25 -0
  174. data/lib/central/cli/vault/read_command.rb +17 -0
  175. data/lib/central/cli/vault/remove_command.rb +14 -0
  176. data/lib/central/cli/vault/update_command.rb +18 -0
  177. data/lib/central/cli/vault/write_command.rb +22 -0
  178. data/lib/central/cli/vault_command.rb +16 -0
  179. data/lib/central/cli/version.rb +5 -0
  180. data/lib/central/cli/version_command.rb +22 -0
  181. data/lib/central/cli/vpn/config_command.rb +25 -0
  182. data/lib/central/cli/vpn/create_command.rb +71 -0
  183. data/lib/central/cli/vpn/delete_command.rb +21 -0
  184. data/lib/central/cli/vpn/remove_command.rb +19 -0
  185. data/lib/central/cli/vpn_command.rb +13 -0
  186. data/lib/central/cli/whoami_command.rb +20 -0
  187. data/lib/central/client.rb +208 -0
  188. data/lib/central/errors.rb +10 -0
  189. data/lib/central/machine/aws.rb +14 -0
  190. data/lib/central/machine/aws/auth_provisioner.rb +161 -0
  191. data/lib/central/machine/aws/cloudinit.yml +71 -0
  192. data/lib/central/machine/aws/cloudinit_master.yml +118 -0
  193. data/lib/central/machine/aws/cloudinit_oauth.yml +76 -0
  194. data/lib/central/machine/aws/common.rb +31 -0
  195. data/lib/central/machine/aws/master_provisioner.rb +171 -0
  196. data/lib/central/machine/aws/node_destroyer.rb +46 -0
  197. data/lib/central/machine/aws/node_provisioner.rb +214 -0
  198. data/lib/central/machine/azure.rb +13 -0
  199. data/lib/central/machine/azure/cloudinit.yml +64 -0
  200. data/lib/central/machine/azure/cloudinit_master.yml +106 -0
  201. data/lib/central/machine/azure/logger.rb +26 -0
  202. data/lib/central/machine/azure/master_provisioner.rb +125 -0
  203. data/lib/central/machine/azure/node_destroyer.rb +52 -0
  204. data/lib/central/machine/azure/node_provisioner.rb +126 -0
  205. data/lib/central/machine/cert_helper.rb +39 -0
  206. data/lib/central/machine/cloud_config/cloudinit.yml +70 -0
  207. data/lib/central/machine/cloud_config/node_generator.rb +27 -0
  208. data/lib/central/machine/common.rb +16 -0
  209. data/lib/central/machine/digital_ocean.rb +13 -0
  210. data/lib/central/machine/digital_ocean/cloudinit.yml +64 -0
  211. data/lib/central/machine/digital_ocean/cloudinit_master.yml +118 -0
  212. data/lib/central/machine/digital_ocean/master_provisioner.rb +99 -0
  213. data/lib/central/machine/digital_ocean/node_destroyer.rb +40 -0
  214. data/lib/central/machine/digital_ocean/node_provisioner.rb +81 -0
  215. data/lib/central/machine/random_name.rb +39 -0
  216. data/lib/central/machine/vagrant.rb +12 -0
  217. data/lib/central/machine/vagrant/Vagrantfile.master.rb.erb +116 -0
  218. data/lib/central/machine/vagrant/Vagrantfile.node.rb.erb +32 -0
  219. data/lib/central/machine/vagrant/cloudinit.yml +73 -0
  220. data/lib/central/machine/vagrant/master_destroyer.rb +34 -0
  221. data/lib/central/machine/vagrant/master_provisioner.rb +79 -0
  222. data/lib/central/machine/vagrant/node_destroyer.rb +38 -0
  223. data/lib/central/machine/vagrant/node_provisioner.rb +68 -0
  224. data/lib/central/scripts/completer +157 -0
  225. data/lib/central/scripts/init +11 -0
  226. data/spec/central/cli/app/common_spec.rb +150 -0
  227. data/spec/central/cli/app/deploy_command_spec.rb +598 -0
  228. data/spec/central/cli/app/docker_helper_spec.rb +102 -0
  229. data/spec/central/cli/app/scale_spec.rb +49 -0
  230. data/spec/central/cli/common_spec.rb +117 -0
  231. data/spec/central/cli/login_command_spec.rb +31 -0
  232. data/spec/central/cli/master/current_command_spec.rb +55 -0
  233. data/spec/central/cli/master/use_command_spec.rb +37 -0
  234. data/spec/central/cli/master/users/invite_command_spec.rb +34 -0
  235. data/spec/central/cli/master/users/remove_command_spec.rb +26 -0
  236. data/spec/central/cli/master/users/roles/add_command_spec.rb +34 -0
  237. data/spec/central/cli/master/users/roles/remove_command_spec.rb +34 -0
  238. data/spec/central/cli/register_command_spec.rb +56 -0
  239. data/spec/central/cli/services/containers_command_spec.rb +40 -0
  240. data/spec/central/cli/services/link_command_spec.rb +38 -0
  241. data/spec/central/cli/services/restart_command_spec.rb +27 -0
  242. data/spec/central/cli/services/secrets/link_command_spec.rb +59 -0
  243. data/spec/central/cli/services/secrets/unlink_command_spec.rb +48 -0
  244. data/spec/central/cli/services/services_helper_spec.rb +170 -0
  245. data/spec/central/cli/services/unlink_command_spec.rb +38 -0
  246. data/spec/central/cli/stacks/trusted_subnets/add_command_spec.rb +37 -0
  247. data/spec/central/cli/stacks/trusted_subnets/list_command_spec.rb +30 -0
  248. data/spec/central/cli/stacks/trusted_subnets/remove_command_spec.rb +37 -0
  249. data/spec/central/cli/version_command_spec.rb +16 -0
  250. data/spec/fixtures/central.yml +17 -0
  251. data/spec/fixtures/docker-compose.yml +8 -0
  252. data/spec/fixtures/mysql.yml +3 -0
  253. data/spec/fixtures/wordpress-scaled.yml +3 -0
  254. data/spec/fixtures/wordpress.yml +2 -0
  255. data/spec/spec_helper.rb +27 -0
  256. data/spec/support/client_helpers.rb +30 -0
  257. data/spec/support/fixtures_helpers.rb +7 -0
  258. data/tasks/rspec.rake +5 -0
  259. metadata +463 -0
@@ -0,0 +1,23 @@
1
+ module Central::Cli::Nodes::Labels
2
+ class RemoveCommand < Clamp::Command
3
+ include Central::Cli::Common
4
+
5
+ parameter 'NODE_ID', 'Node id'
6
+ parameter 'LABEL', 'Label'
7
+
8
+ def execute
9
+ require_api_url
10
+ require_current_stack
11
+ token = require_token
12
+
13
+ node = client(token).get("stacks/#{current_stack}/nodes/#{node_id}")
14
+ unless node['labels'].include?(label)
15
+ abort("Node #{node['name']} does not have label #{label}")
16
+ end
17
+ node['labels'].delete(label)
18
+ data = {}
19
+ data[:labels] = node['labels']
20
+ client.put("nodes/#{node['id']}", data, {}, 'Central-Stack-Token' => node['stack']['token'])
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,62 @@
1
+
2
+ require 'tty'
3
+
4
+ module Central::Cli::Nodes
5
+ class ListCommand < Clamp::Command
6
+ include Central::Cli::Common
7
+ include Central::Cli::StackOptions
8
+
9
+ option ['--all'], :flag, 'List nodes for all stacks', default: false
10
+
11
+ def execute
12
+ require_api_url
13
+ require_current_stack
14
+ token = require_token
15
+ rows = []
16
+
17
+ if all?
18
+ stacks = client(token).get('stacks')
19
+ header = ['Name', 'Public IP', 'Status', 'Labels']
20
+
21
+ stacks['stacks'].each do |stack|
22
+ nodes = client(token).get("stacks/#{stack['name']}/nodes")
23
+ nodes['nodes'].each do |node|
24
+ status = if node['connected']
25
+ ' ✓ '.colorize(:green)
26
+ else
27
+ ' ✘ '.colorize(:red)
28
+ end
29
+ rows << [
30
+ "#{stack['name']}/#{node['name']}",
31
+ node['public_ip'],
32
+ status,
33
+ (node['labels'] || ['-']).join(', ')
34
+ ]
35
+ end
36
+ end
37
+ else
38
+ nodes = client(token).get("stacks/#{current_stack}/nodes")
39
+ header = ['Name', 'Public IP', 'Status', 'Labels']
40
+ nodes['nodes'].each do |node|
41
+ status = if node['connected']
42
+ ' ✓ '.colorize(:green)
43
+ else
44
+ ' ✘ '.colorize(:red)
45
+ end
46
+ rows << [
47
+ node['name'],
48
+ node['public_ip'],
49
+ status,
50
+ (node['labels'] || ['-']).join(', ')
51
+ ]
52
+ end
53
+
54
+ ttable = TTY::Table.new header: header, rows: Array.new(rows)
55
+ renderer = TTY::Table::Renderer::Unicode.new(ttable)
56
+ renderer.border.style = :cyan
57
+ renderer.padding = [0, 1, 0, 1]
58
+ puts renderer.render
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,16 @@
1
+ module Central::Cli::Nodes
2
+ class RemoveCommand < Clamp::Command
3
+ include Central::Cli::Common
4
+ include Central::Cli::StackOptions
5
+
6
+ parameter 'NODE_ID', 'Node id'
7
+
8
+ def execute
9
+ require_api_url
10
+ require_current_stack
11
+ token = require_token
12
+
13
+ client(token).delete("stacks/#{current_stack}/nodes/#{node_id}")
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,23 @@
1
+ module Central::Cli::Nodes
2
+ class RemoveLabelCommand < Clamp::Command
3
+ include Central::Cli::Common
4
+
5
+ parameter 'NODE_ID', 'Node id'
6
+ parameter 'LABEL', 'Label'
7
+
8
+ def execute
9
+ require_api_url
10
+ require_current_stack
11
+ token = require_token
12
+
13
+ node = client(token).get("stacks/#{current_stack}/nodes/#{node_id}")
14
+ unless node['labels'].include?(label)
15
+ abort("Node #{node['name']} does not have label #{label}")
16
+ end
17
+ node['labels'].delete(label)
18
+ data = {}
19
+ data[:labels] = node['labels']
20
+ client.put("nodes/#{node['id']}", data, {}, 'Central-Stack-Token' => node['stack']['token'])
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,49 @@
1
+ module Central::Cli::Nodes
2
+ class ShowCommand < Clamp::Command
3
+ include Central::Cli::Common
4
+ include Central::Cli::StackOptions
5
+ include Central::Cli::BytesHelper
6
+
7
+ parameter 'NODE_ID', 'Node id'
8
+
9
+ def execute
10
+ require_api_url
11
+ require_current_stack
12
+ token = require_token
13
+
14
+ node = client(token).get("stacks/#{current_stack}/nodes/#{node_id}")
15
+ puts "#{node['name']}:"
16
+ puts " id: #{node['id']}"
17
+ puts " connected: #{node['connected'] ? 'yes' : 'no'}"
18
+ puts " last connect: #{node['updated_at']}"
19
+ puts " last seen: #{node['last_seen_at']}"
20
+ puts " public ip: #{node['public_ip']}"
21
+ puts " private ip: #{node['private_ip']}"
22
+ puts " overlay network: 10.81.#{node['node_number']}.0/24"
23
+ puts " os: #{node['os']}"
24
+ puts " driver: #{node['driver']}"
25
+ puts " kernel: #{node['kernel_version']}"
26
+ puts " cpus: #{node['cpus']}"
27
+ puts " memory: #{node['mem_total'] / 1024 / 1024}M"
28
+ puts ' labels:'
29
+ node['labels'].each { |l| puts " - #{l}" } if node['labels']
30
+ puts ' stats:'
31
+ puts " cpus: #{node['cpus']}"
32
+ loads = node.dig('resource_usage', 'load')
33
+ if loads
34
+ puts " load: #{loads['1m'].round(2)} #{loads['5m'].round(2)} #{loads['15m'].round(2)}"
35
+ end
36
+ mem = node.dig('resource_usage', 'memory')
37
+ if mem
38
+ mem_used = mem['used'] - (mem['cached'] + mem['buffers'])
39
+ puts " memory: #{to_gigabytes(mem_used, 2)} of #{to_gigabytes(mem['total'], 2)} GB"
40
+ end
41
+ if node['resource_usage']['filesystem']
42
+ puts ' filesystem:'
43
+ node['resource_usage']['filesystem'].each do |filesystem|
44
+ puts " - #{filesystem['name']}: #{to_gigabytes(filesystem['used'], 2)} of #{to_gigabytes(filesystem['total'], 2)} GB"
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,31 @@
1
+ module Central::Cli::Nodes
2
+ class SshCommand < Clamp::Command
3
+ include Central::Cli::Common
4
+ include Central::Cli::StackOptions
5
+
6
+ parameter 'NODE_ID', 'Node id'
7
+ option ['-i', '--identity-file'], 'IDENTITY_FILE', 'Path to ssh private key'
8
+ option ['-u', '--user'], 'USER', 'Login as a user', default: 'core'
9
+ option '--private-ip', :flag, "Connect to node's private IP address"
10
+ option '--internal-ip', :flag, "Connect to node's internal IP address (requires VPN connection)"
11
+
12
+ def execute
13
+ require_api_url
14
+ require_current_stack
15
+ token = require_token
16
+
17
+ node = client(token).get("stacks/#{current_stack}/nodes/#{node_id}")
18
+ cmd = ['ssh']
19
+ cmd << "-i #{identity_file}" if identity_file
20
+ ip = if internal_ip?
21
+ "10.81.0.#{node['node_number']}"
22
+ elsif private_ip?
23
+ node['private_ip']
24
+ else
25
+ node['public_ip']
26
+ end
27
+ cmd << "#{user}@#{ip}"
28
+ exec(cmd.join(' '))
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,20 @@
1
+ module Central::Cli::Nodes
2
+ class UpdateCommand < Clamp::Command
3
+ include Central::Cli::Common
4
+ include Central::Cli::StackOptions
5
+
6
+ parameter 'NODE_ID', 'Node id'
7
+ option ['-l', '--label'], 'LABEL', 'Node label', multivalued: true
8
+
9
+ def execute
10
+ require_api_url
11
+ require_current_stack
12
+ token = require_token
13
+
14
+ node = client(token).get("stacks/#{current_stack}/nodes/#{node_id}")
15
+ data = {}
16
+ data[:labels] = label_list if label_list
17
+ client.put("nodes/#{node['id']}", data, {}, 'Central-Stack-Token' => node['stack']['token'])
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,27 @@
1
+ module Central::Cli::Nodes::Vagrant
2
+ class CreateCommand < Clamp::Command
3
+ include Central::Cli::Common
4
+ include Central::Cli::StackOptions
5
+
6
+ parameter '[NAME]', 'Node name'
7
+ option '--memory', 'MEMORY', 'How much memory node has', default: '1024'
8
+ option '--version', 'VERSION', 'Define installed Central version', default: 'latest'
9
+
10
+ def execute
11
+ require_api_url
12
+ require_current_stack
13
+
14
+ require 'central/machine/vagrant'
15
+ stack = client(require_token).get("stacks/#{current_stack}")
16
+ provisioner = Central::Machine::Vagrant::NodeProvisioner.new(client(require_token))
17
+ provisioner.run!(
18
+ master_uri: api_url,
19
+ stack_token: stack['token'],
20
+ stack: current_stack,
21
+ name: name,
22
+ memory: memory,
23
+ version: version
24
+ )
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,26 @@
1
+ module Central::Cli::Nodes::Vagrant
2
+ class RestartCommand < Clamp::Command
3
+ include Central::Cli::Common
4
+ include Central::Cli::StackOptions
5
+
6
+ parameter 'NAME', 'Node name'
7
+
8
+ def execute
9
+ require_api_url
10
+ require_current_stack
11
+
12
+ require 'central/machine/vagrant'
13
+ vagrant_path = "#{Dir.home}/.central/#{current_stack}/#{name}"
14
+ abort("Cannot find Vagrant node #{name}".colorize(:red)) unless Dir.exist?(vagrant_path)
15
+ Dir.chdir(vagrant_path) do
16
+ ShellSpinner "Restarting Vagrant machine #{name.colorize(:cyan)} " do
17
+ Open3.popen2('vagrant reload') do |_stdin, output, _wait|
18
+ while o = output.gets
19
+ print o if ENV['DEBUG']
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,21 @@
1
+ module Central::Cli::Nodes::Vagrant
2
+ class SshCommand < Clamp::Command
3
+ include Central::Cli::Common
4
+ include Central::Cli::StackOptions
5
+
6
+ parameter 'NAME', 'Node name'
7
+
8
+ def execute
9
+ require_api_url
10
+ require_current_stack
11
+
12
+ require 'central/machine/vagrant'
13
+ vagrant_path = "#{Dir.home}/.central/#{current_stack}/#{name}"
14
+ abort("Cannot find Vagrant node #{name}".colorize(:red)) unless Dir.exist?(vagrant_path)
15
+
16
+ Dir.chdir(vagrant_path) do
17
+ system('vagrant ssh')
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,26 @@
1
+ module Central::Cli::Nodes::Vagrant
2
+ class StartCommand < Clamp::Command
3
+ include Central::Cli::Common
4
+ include Central::Cli::StackOptions
5
+
6
+ parameter 'NAME', 'Node name'
7
+
8
+ def execute
9
+ require_api_url
10
+ require_current_stack
11
+
12
+ require 'central/machine/vagrant'
13
+ vagrant_path = "#{Dir.home}/.central/#{current_stack}/#{name}"
14
+ abort("Cannot find Vagrant node #{name}".colorize(:red)) unless Dir.exist?(vagrant_path)
15
+ Dir.chdir(vagrant_path) do
16
+ ShellSpinner "Starting Vagrant machine #{name.colorize(:cyan)} " do
17
+ Open3.popen2('vagrant up') do |_stdin, output, _wait|
18
+ while o = output.gets
19
+ print o if ENV['DEBUG']
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ module Central::Cli::Nodes::Vagrant
2
+ class StopCommand < Clamp::Command
3
+ include Central::Cli::Common
4
+ include Central::Cli::StackOptions
5
+
6
+ parameter 'NAME', 'Node name'
7
+
8
+ def execute
9
+ require_api_url
10
+ require_current_stack
11
+
12
+ require 'central/machine/vagrant'
13
+ vagrant_path = "#{Dir.home}/.central/#{current_stack}/#{name}"
14
+ abort("Cannot find Vagrant node #{name}".colorize(:red)) unless Dir.exist?(vagrant_path)
15
+ Dir.chdir(vagrant_path) do
16
+ ShellSpinner "Stopping Vagrant machine #{name.colorize(:cyan)} " do
17
+ Open3.popen2('vagrant halt') do |_stdin, output, _wait|
18
+ while o = output.gets
19
+ print o if ENV['DEBUG']
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,17 @@
1
+ module Central::Cli::Nodes::Vagrant
2
+ class TerminateCommand < Clamp::Command
3
+ include Central::Cli::Common
4
+ include Central::Cli::StackOptions
5
+
6
+ parameter 'NAME', 'Node name'
7
+
8
+ def execute
9
+ require_api_url
10
+ require_current_stack
11
+
12
+ require 'central/machine/vagrant'
13
+ destroyer = Central::Machine::Vagrant::NodeDestroyer.new(client(require_token))
14
+ destroyer.run!(current_stack, name)
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,20 @@
1
+ require_relative 'vagrant/create_command'
2
+ require_relative 'vagrant/start_command'
3
+ require_relative 'vagrant/stop_command'
4
+ require_relative 'vagrant/restart_command'
5
+ require_relative 'vagrant/terminate_command'
6
+ require_relative 'vagrant/ssh_command'
7
+
8
+ module Central::Cli::Nodes
9
+ class VagrantCommand < Clamp::Command
10
+ subcommand 'create', 'Create a new Vagrant node', Vagrant::CreateCommand
11
+ subcommand 'ssh', 'SSH into Vagrant node', Vagrant::SshCommand
12
+ subcommand 'start', 'Start Vagrant node', Vagrant::StartCommand
13
+ subcommand 'stop', 'Stop Vagrant node', Vagrant::StopCommand
14
+ subcommand 'restart', 'Restart Vagrant node', Vagrant::RestartCommand
15
+ subcommand 'terminate', 'Terminate Vagrant node', Vagrant::TerminateCommand
16
+
17
+ def execute
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,21 @@
1
+ class Central::Cli::RegisterCommand < Clamp::Command
2
+ include Central::Cli::Common
3
+
4
+ option '--auth-provider-url', 'AUTH_PROVIDER_URL', 'Auth provider URL'
5
+
6
+ def execute
7
+ require 'highline/import'
8
+
9
+ auth_api_url = auth_provider_url || 'https://auth.bluebeluga.io'
10
+ if !auth_api_url.start_with?('http://') && !auth_api_url.start_with?('https://')
11
+ auth_api_url = "https://#{auth_api_url}"
12
+ end
13
+ email = ask('Email: ')
14
+ password = ask('Password: ') { |q| q.echo = '*' }
15
+ password2 = ask('Password again: ') { |q| q.echo = '*' }
16
+ abort("Passwords don't match".colorize(:red)) if password != password2
17
+ params = { email: email, password: password }
18
+ auth_client = Central::Client.new(auth_api_url)
19
+ auth_client.post('users', params)
20
+ end
21
+ end
@@ -0,0 +1,144 @@
1
+ require 'shell-spinner'
2
+
3
+ module Central::Cli::Registry
4
+ class CreateCommand < Clamp::Command
5
+ include Central::Cli::Common
6
+ include Central::Cli::StackOptions
7
+
8
+ REGISTRY_VERSION = '2.2.0'.freeze
9
+
10
+ option '--node', 'NODE', 'Node name'
11
+ option '--s3-bucket', 'S3_BUCKET', 'S3 bucket'
12
+ option '--s3-region', 'S3_REGION', 'S3 region', default: 'us-west-2'
13
+ option '--s3-encrypt', :flag, 'Encrypt S3 objects', default: false
14
+ option '--s3-secure', :flag, 'Use secure connection in S3', default: true
15
+ option '--azure-account-name', 'AZURE_ACCOUNT_NAME', 'Azure account name'
16
+ option '--azure-container-name', 'AZURE_CONTAINER_NAME', 'Azure container name'
17
+
18
+ def execute
19
+ require_api_url
20
+ token = require_token
21
+ preferred_node = node
22
+ secrets = []
23
+ affinity = []
24
+ stateful = true
25
+ instances = 1
26
+
27
+ registry = begin
28
+ client(token).get("services/#{current_stack}/registry")
29
+ rescue
30
+ nil
31
+ end
32
+ abort('Registry already exists') if registry
33
+
34
+ nodes = client(token).get("stacks/#{current_stack}/nodes")
35
+
36
+ if s3_bucket
37
+ %w(REGISTRY_STORAGE_S3_ACCESSKEY REGISTRY_STORAGE_S3_SECRETKEY).each do |secret|
38
+ abort("#{secret} secret is missing from the vault") unless vault_secret_exists?(secret)
39
+ end
40
+ env = [
41
+ 'REGISTRY_STORAGE=s3',
42
+ "REGISTRY_STORAGE_S3_REGION=#{s3_region}",
43
+ "REGISTRY_STORAGE_S3_BUCKET=#{s3_bucket}",
44
+ "REGISTRY_STORAGE_S3_ENCRYPT=#{s3_encrypt?}",
45
+ "REGISTRY_STORAGE_S3_SECURE=#{s3_secure?}"
46
+ ]
47
+ secrets = [
48
+ { secret: 'REGISTRY_STORAGE_S3_ACCESSKEY', name: 'REGISTRY_STORAGE_S3_ACCESSKEY', type: 'env' },
49
+ { secret: 'REGISTRY_STORAGE_S3_SECRETKEY', name: 'REGISTRY_STORAGE_S3_SECRETKEY', type: 'env' }
50
+ ]
51
+ stateful = false
52
+ instances = 2 if nodes['nodes'].size > 1
53
+ elsif azure_account_name || azure_container_name
54
+ abort('--azure-account-name is missing') if azure_account_name.nil?
55
+ abort('--azure-container-name is missing') if azure_container_name.nil?
56
+ abort('REGISTRY_STORAGE_AZURE_ACCOUNTKEY is not saved to vault') unless vault_secret_exists?('REGISTRY_STORAGE_AZURE_ACCOUNTKEY')
57
+ env = [
58
+ 'REGISTRY_STORAGE=azure',
59
+ "REGISTRY_STORAGE_AZURE_ACCOUNTNAME=#{azure_account_name}",
60
+ "REGISTRY_STORAGE_AZURE_ACCOUNTKEY=#{azure_account_key}"
61
+ ]
62
+ secrets = [
63
+ { secret: 'REGISTRY_STORAGE_AZURE_ACCOUNTKEY', name: 'REGISTRY_STORAGE_AZURE_ACCOUNTKEY', type: 'env' }
64
+ ]
65
+ stateful = false
66
+ instances = 2 if nodes['nodes'].size > 1
67
+ else
68
+ env = [
69
+ 'REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/registry'
70
+ ]
71
+ if preferred_node
72
+ node = nodes['nodes'].find { |n| n['connected'] && n['name'] == preferred_node }
73
+ abort('Node not found') if node.nil?
74
+ affinity << "node==#{node['name']}"
75
+ end
76
+ end
77
+
78
+ if vault_secret_exists?('REGISTRY_AUTH_PASSWORD')
79
+ secrets << { secret: 'REGISTRY_AUTH_PASSWORD', name: 'AUTH_PASSWORD', type: 'env' }
80
+ configure_registry_auth(vault_secret('REGISTRY_AUTH_PASSWORD'))
81
+ end
82
+ if vault_secret_exists?('REGISTRY_HTTP_TLS_CERTIFICATE')
83
+ secrets << { secret: 'REGISTRY_HTTP_TLS_CERTIFICATE', name: 'REGISTRY_HTTP_TLS_CERTIFICATE', type: 'env' }
84
+ secrets << { secret: 'REGISTRY_HTTP_TLS_KEY', name: 'REGISTRY_HTTP_TLS_KEY', type: 'env' }
85
+ env << 'REGISTRY_HTTP_ADDR=0.0.0.0:443'
86
+ else
87
+ env << 'REGISTRY_HTTP_ADDR=0.0.0.0:80'
88
+ end
89
+ env << "REGISTRY_HTTP_SECRET=#{SecureRandom.hex(24)}"
90
+
91
+ data = {
92
+ name: 'registry',
93
+ stateful: stateful,
94
+ container_count: instances,
95
+ image: "fishyard/registry:#{REGISTRY_VERSION}",
96
+ volumes: ['/registry'],
97
+ env: env,
98
+ secrets: secrets,
99
+ affinity: affinity
100
+ }
101
+ client(token).post("stacks/#{current_stack}/services", data)
102
+ client(token).post("services/#{current_stack}/registry/deploy", {})
103
+ ShellSpinner 'Deploying registry service ' do
104
+ sleep 1 until client(token).get("services/#{current_stack}/registry")['state'] != 'deploying'
105
+ end
106
+ puts "\n"
107
+ puts "Docker Registry #{REGISTRY_VERSION} is now running at registry.#{current_stack}.central.local."
108
+ puts 'Note: '
109
+ puts ' - OpenVPN connection is needed to establish connection to this registry. See http://www.central.io/docs/using-central/vpn-access for details'
110
+ puts " - you must set '--insecure-registry registry.#{current_stack}.central.local' to your client docker daemon before you are able to push to this registry"
111
+ end
112
+
113
+ # @param [String] name
114
+ # @return [Boolean]
115
+ def vault_secret_exists?(name)
116
+ client(require_token).get("secrets/#{current_stack}/#{name}")
117
+ true
118
+ rescue
119
+ false
120
+ end
121
+
122
+ # @param [String] name
123
+ # @return [String]
124
+ def vault_secret(name)
125
+ secret = client(require_token).get("secrets/#{current_stack}/#{name}")
126
+ secret['value']
127
+ end
128
+
129
+ # @param [String] password
130
+ def configure_registry_auth(password)
131
+ data = {
132
+ username: 'admin',
133
+ password: password,
134
+ email: 'not@val.id',
135
+ url: "http://registry.#{current_stack}.central.local/"
136
+ }
137
+ begin
138
+ client(require_token).post("stacks/#{current_stack}/external_registries", data)
139
+ rescue
140
+ nil
141
+ end
142
+ end
143
+ end
144
+ end