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,40 @@
1
+ require 'shell-spinner'
2
+
3
+ module Central
4
+ module Machine
5
+ module DigitalOcean
6
+ class NodeDestroyer
7
+ include RandomName
8
+
9
+ attr_reader :client, :api_client
10
+
11
+ # @param [Central::Client] api_client Central api client
12
+ # @param [String] token Digital Ocean token
13
+ def initialize(api_client, token)
14
+ @api_client = api_client
15
+ @client = DropletKit::Client.new(access_token: token)
16
+ end
17
+
18
+ def run!(stack, name)
19
+ droplet = client.droplets.all.find { |d| d.name == name }
20
+ if droplet
21
+ ShellSpinner "Terminating DigitalOcean droplet #{name.colorize(:cyan)} " do
22
+ result = client.droplets.delete(id: droplet.id)
23
+ if result.is_a?(String)
24
+ abort "Cannot delete droplet #{name.colorize(:cyan)} in DigitalOcean"
25
+ end
26
+ end
27
+ else
28
+ abort "Cannot find droplet #{name.colorize(:cyan)} in DigitalOcean"
29
+ end
30
+ node = api_client.get("stacks/#{stack['id']}/nodes")['nodes'].find { |n| n['name'] == name }
31
+ if node
32
+ ShellSpinner "Removing node #{name.colorize(:cyan)} from stack #{stack['name'].colorize(:cyan)} " do
33
+ api_client.delete("stacks/#{stack['id']}/nodes/#{name}")
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,81 @@
1
+ require 'fileutils'
2
+ require 'erb'
3
+ require 'open3'
4
+ require 'shell-spinner'
5
+
6
+ module Central
7
+ module Machine
8
+ module DigitalOcean
9
+ class NodeProvisioner
10
+ include RandomName
11
+
12
+ attr_reader :client, :api_client
13
+
14
+ # @param [Central::Client] api_client Central api client
15
+ # @param [String] token Digital Ocean token
16
+ def initialize(api_client, token)
17
+ @api_client = api_client
18
+ @client = DropletKit::Client.new(access_token: token)
19
+ end
20
+
21
+ def run!(opts)
22
+ abort('Invalid ssh key') unless File.exist?(File.expand_path(opts[:ssh_key]))
23
+
24
+ ssh_key = ssh_key(File.read(File.expand_path(opts[:ssh_key])).strip)
25
+ abort('Ssh key does not exist in Digital Ocean') unless ssh_key
26
+
27
+ userdata_vars = {
28
+ version: opts[:version],
29
+ master_uri: opts[:master_uri],
30
+ stack_token: opts[:stack_token]
31
+ }
32
+
33
+ droplet = DropletKit::Droplet.new(
34
+ name: opts[:name] || generate_name,
35
+ region: opts[:region],
36
+ image: 'coreos-stable',
37
+ size: opts[:size],
38
+ private_networking: true,
39
+ user_data: user_data(userdata_vars),
40
+ ssh_keys: [ssh_key.id]
41
+ )
42
+ created = client.droplets.create(droplet)
43
+ ShellSpinner "Creating DigitalOcean droplet #{droplet.name.colorize(:cyan)} " do
44
+ sleep 5 until client.droplets.find(id: created.id).status == 'active'
45
+ end
46
+ node = nil
47
+ ShellSpinner "Waiting for node #{droplet.name.colorize(:cyan)} join to stack #{opts[:stack].colorize(:cyan)} " do
48
+ sleep 2 until node = droplet_exists_in_stack?(opts[:stack], droplet)
49
+ end
50
+ set_labels(node, ["region=#{opts[:region]}"])
51
+ end
52
+
53
+ def user_data(vars)
54
+ cloudinit_template = File.join(__dir__, '/cloudinit.yml')
55
+ erb(File.read(cloudinit_template), vars)
56
+ end
57
+
58
+ def generate_name
59
+ "#{super}-#{rand(1..99)}"
60
+ end
61
+
62
+ def ssh_key(public_key)
63
+ ssh_key = client.ssh_keys.all.find { |key| key.public_key == public_key }
64
+ end
65
+
66
+ def droplet_exists_in_stack?(stack, droplet)
67
+ api_client.get("stacks/#{stack}/nodes")['nodes'].find { |n| n['name'] == droplet.name }
68
+ end
69
+
70
+ def erb(template, vars)
71
+ ERB.new(template).result(OpenStruct.new(vars).instance_eval { binding })
72
+ end
73
+
74
+ def set_labels(node, labels)
75
+ data = { labels: labels }
76
+ api_client.put("nodes/#{node['id']}", data, {}, 'Central-Stack-Token' => node['stack']['token'])
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,39 @@
1
+ module Central
2
+ module Machine
3
+ module RandomName
4
+ def generate_name
5
+ rnd1 = Random.rand(64)
6
+ rnd2 = Random.rand(64)
7
+ "#{adjectives[rnd1 % adjectives.length]}-#{nouns[rnd2 % adjectives.length]}"
8
+ end
9
+
10
+ private
11
+
12
+ def adjectives
13
+ %w(
14
+ autumn hidden bitter misty silent empty dry dark
15
+ summer icy delicate quiet white cool spring winter
16
+ patient twilight dawn crimson wispy weathered blue
17
+ billowing broken cold damp falling frosty green
18
+ long late bold little morning muddy
19
+ red rough still small sparkling shy
20
+ wandering withered wild black young holy solitary
21
+ fragrant aged snowy proud floral restless
22
+ polished purple lively nameless)
23
+ end
24
+
25
+ def nouns
26
+ %w(
27
+ waterfall river breeze moon rain wind sea morning
28
+ snow lake sunset pine shadow leaf dawn glitter
29
+ forest hill cloud meadow sun glade bird brook
30
+ butterfly bush dew dust field fire flower firefly
31
+ feather grass haze mountain night pond darkness
32
+ snowflake silence sound sky shape surf thunder
33
+ violet water wildflower wave water resonance sun
34
+ wood dream cherry tree fog frost voice paper
35
+ frog smoke star)
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,12 @@
1
+ require_relative 'common'
2
+ include Central::Machine::Common
3
+
4
+ unless which('vagrant')
5
+ abort('Vagrant is not installed. See https://www.vagrantup.com/ for instructions.')
6
+ end
7
+
8
+ require_relative 'random_name'
9
+ require_relative 'vagrant/master_provisioner'
10
+ require_relative 'vagrant/master_destroyer'
11
+ require_relative 'vagrant/node_provisioner'
12
+ require_relative 'vagrant/node_destroyer'
@@ -0,0 +1,116 @@
1
+ # -*- mode: ruby -*-
2
+ # vi: set ft=ruby :
3
+
4
+ # Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
5
+ VAGRANTFILE_API_VERSION = "2"
6
+
7
+ cloud_init = <<INIT
8
+ #cloud-config
9
+ write_files:
10
+ - path: /etc/central-server.env
11
+ permissions: 0600
12
+ owner: root
13
+ content: |
14
+ CENTRAL_VERSION=<%= version %>
15
+ CENTRAL_VAULT_KEY=<%= vault_secret %>
16
+ CENTRAL_VAULT_IV=<%= vault_iv %>
17
+ coreos:
18
+ update:
19
+ reboot-strategy: off
20
+ units:
21
+ - name: central-server-mongo.service
22
+ command: start
23
+ enable: true
24
+ content: |
25
+ [Unit]
26
+ Description=central-server-mongo
27
+ After=network-online.target
28
+ After=docker.service
29
+ Description=Central Server MongoDB
30
+ Documentation=http://www.mongodb.org/
31
+ Requires=network-online.target
32
+ Requires=docker.service
33
+
34
+ [Service]
35
+ Restart=always
36
+ RestartSec=5
37
+ ExecStartPre=/usr/bin/docker pull mongo:3.0
38
+ ExecStartPre=-/usr/bin/docker create --name=central-server-mongo-data mongo:3.0
39
+ ExecStartPre=-/usr/bin/docker stop central-server-mongo
40
+ ExecStartPre=-/usr/bin/docker rm central-server-mongo
41
+ ExecStart=/usr/bin/docker run --name=central-server-mongo \
42
+ --volumes-from=central-server-mongo-data \
43
+ mongo:3.0 mongod --smallfiles
44
+
45
+ - name: central-server-api.service
46
+ command: start
47
+ enable: true
48
+ content: |
49
+ [Unit]
50
+ Description=central-server-api
51
+ After=network-online.target
52
+ After=docker.service
53
+ After=central-server-mongo.service
54
+ Description=Central Machine
55
+ Documentation=http://www.central.io/
56
+ Requires=network-online.target
57
+ Requires=docker.service
58
+ Requires=central-server-mongo.service
59
+
60
+ [Service]
61
+ Restart=always
62
+ RestartSec=5
63
+ EnvironmentFile=/etc/central-server.env
64
+ ExecStartPre=-/usr/bin/docker stop central-server-api
65
+ ExecStartPre=-/usr/bin/docker rm central-server-api
66
+ ExecStartPre=/usr/bin/docker pull fishyard/server:${CENTRAL_VERSION}
67
+ ExecStart=/usr/bin/docker run --name central-server-api \
68
+ --link central-server-mongo:mongodb \
69
+ -e MONGODB_URI=mongodb://mongodb:27017/central_server \
70
+ -e VAULT_KEY=${CENTRAL_VAULT_KEY} -e VAULT_IV=${CENTRAL_VAULT_IV} \
71
+ <% if auth_server %>-e AUTH_API_URL=<%= auth_server %><% end %> \
72
+ -p 8080:9292 \
73
+ fishyard/server:${CENTRAL_VERSION}
74
+ INIT
75
+
76
+ cloud_init_file = Tempfile.new('central-machine')
77
+ File.write(cloud_init_file.path, cloud_init)
78
+
79
+ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
80
+ config.vm.provider :virtualbox do |v|
81
+ v.check_guest_additions = false
82
+ v.functional_vboxsf = false
83
+ end
84
+
85
+ if Vagrant.has_plugin?("vagrant-vbguest") then
86
+ config.vbguest.auto_update = false
87
+ end
88
+
89
+ if Vagrant.has_plugin?('vagrant-cachier')
90
+ config.cache.scope = :box
91
+ end
92
+
93
+ config.vm.define "<%= name %>" do |docker|
94
+ docker.vm.box = "coreos-stable"
95
+ docker.vm.box_url = "http://stable.release.core-os.net/amd64-usr/current/coreos_production_vagrant.json"
96
+ docker.vm.network "private_network", ip: "192.168.66.100"
97
+ docker.vm.hostname = "<%= name %>"
98
+ docker.vm.provider "virtualbox" do |vb|
99
+ vb.gui = false
100
+ vb.customize ["modifyvm", :id, "--memory", "512"]
101
+ vb.auto_nat_dns_proxy = false
102
+ vb.customize ["modifyvm", :id, "--natdnsproxy1", "off" ]
103
+ vb.customize ["modifyvm", :id, "--natdnshostresolver1", "off" ]
104
+ end
105
+ [:vmware_fusion, :vmware_workstation].each do |vmware|
106
+ config.vm.provider vmware do |v, override|
107
+ v.gui = false
108
+ v.vmx['memsize'] = 512
109
+ v.vmx['numvcpus'] = 2
110
+ override.vm.box_url = "http://stable.release.core-os.net/amd64-usr/current/coreos_production_vagrant_vmware_fusion.json"
111
+ end
112
+ end
113
+ docker.vm.provision :file, :source => cloud_init_file.path, :destination => "/tmp/vagrantfile-user-data"
114
+ docker.vm.provision :shell, :inline => "mv /tmp/vagrantfile-user-data /var/lib/coreos-vagrant/", :privileged => true
115
+ end
116
+ end
@@ -0,0 +1,32 @@
1
+ # -*- mode: ruby -*-
2
+ # vi: set ft=ruby :
3
+
4
+ # Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
5
+ VAGRANTFILE_API_VERSION = "2"
6
+
7
+ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
8
+ config.vm.provider :virtualbox do |v|
9
+ v.check_guest_additions = false
10
+ v.functional_vboxsf = false
11
+ end
12
+
13
+ if Vagrant.has_plugin?("vagrant-vbguest") then
14
+ config.vbguest.auto_update = false
15
+ end
16
+
17
+ config.vm.define "<%= name %>" do |docker|
18
+ docker.vm.box = "coreos-stable"
19
+ docker.vm.box_url = "http://stable.release.core-os.net/amd64-usr/current/coreos_production_vagrant.json"
20
+ docker.vm.network "private_network", type: "dhcp"
21
+ docker.vm.hostname = "<%= name %>"
22
+ docker.vm.provider "virtualbox" do |vb|
23
+ vb.gui = false
24
+ vb.customize ["modifyvm", :id, "--memory", "<%= memory %>"]
25
+ vb.auto_nat_dns_proxy = false
26
+ vb.customize ["modifyvm", :id, "--natdnsproxy1", "off" ]
27
+ vb.customize ["modifyvm", :id, "--natdnshostresolver1", "off" ]
28
+ end
29
+ docker.vm.provision :file, :source => "<%= cloudinit %>", :destination => "/tmp/vagrantfile-user-data"
30
+ docker.vm.provision :shell, :inline => "mv /tmp/vagrantfile-user-data /var/lib/coreos-vagrant/", :privileged => true
31
+ end
32
+ end
@@ -0,0 +1,73 @@
1
+ #cloud-config
2
+ write_files:
3
+ - path: /etc/central-agent.env
4
+ permissions: 0600
5
+ owner: root
6
+ content: |
7
+ CENTRAL_URI="<%= master_uri %>"
8
+ CENTRAL_TOKEN="<%= stack_token %>"
9
+ CENTRAL_PEER_INTERFACE=eth1
10
+ CENTRAL_VERSION=<%= version %>
11
+ - path: /etc/systemd/system/docker.service.d/50-central.conf
12
+ content: |
13
+ [Service]
14
+ Environment='DOCKER_OPTS=--insecure-registry="10.81.0.0/19" --bip="172.17.43.1/16"'
15
+ - path: /etc/sysctl.d/99-inotify.conf
16
+ owner: root
17
+ permissions: 0644
18
+ content: |
19
+ fs.inotify.max_user_instances = 8192
20
+ coreos:
21
+ update:
22
+ reboot-strategy: off
23
+ units:
24
+ - name: 00-eth.network
25
+ runtime: true
26
+ content: |
27
+ [Match]
28
+ Name=eth*
29
+ [Network]
30
+ DHCP=yes
31
+ DNS=172.17.43.1
32
+ DNS=172.28.128.1
33
+ DNS=8.8.8.8
34
+ DOMAINS=central.local
35
+ [DHCP]
36
+ UseDNS=false
37
+
38
+ - name: 10-weave.network
39
+ runtime: false
40
+ content: |
41
+ [Match]
42
+ Type=bridge
43
+ Name=weave*
44
+
45
+ [Network]
46
+ - name: central-agent.service
47
+ command: start
48
+ enable: true
49
+ content: |
50
+ [Unit]
51
+ Description=central-agent
52
+ After=network-online.target
53
+ After=docker.service
54
+ Description=Central Agent
55
+ Documentation=http://www.central.io/
56
+ Requires=network-online.target
57
+ Requires=docker.service
58
+
59
+ [Service]
60
+ Restart=always
61
+ RestartSec=5
62
+ EnvironmentFile=/etc/central-agent.env
63
+ ExecStartPre=-/usr/bin/docker stop central-agent
64
+ ExecStartPre=-/usr/bin/docker rm central-agent
65
+ ExecStartPre=/usr/bin/docker pull fishyard/agent:${CENTRAL_VERSION}
66
+ ExecStart=/usr/bin/docker run --name central-agent \
67
+ -e CENTRAL_URI=${CENTRAL_URI} \
68
+ -e CENTRAL_TOKEN=${CENTRAL_TOKEN} \
69
+ -e CENTRAL_PEER_INTERFACE=${CENTRAL_PEER_INTERFACE} \
70
+ -v=/var/run/docker.sock:/var/run/docker.sock \
71
+ -v=/etc/central-agent.env:/etc/central.env \
72
+ --net=host \
73
+ fishyard/agent:${CENTRAL_VERSION}
@@ -0,0 +1,34 @@
1
+ require 'fileutils'
2
+
3
+ module Central
4
+ module Machine
5
+ module Vagrant
6
+ class MasterDestroyer
7
+ attr_reader :client, :api_client
8
+
9
+ # @param [Central::Client] api_client Central api client
10
+ def initialize(api_client)
11
+ @api_client = api_client
12
+ end
13
+
14
+ def run!
15
+ if api_client.get('stacks')['stacks'].size > 0
16
+ abort('Cannot remove central-machine because it has stacks'.colorize(:red))
17
+ end
18
+
19
+ vagrant_path = "#{Dir.home}/.central/vagrant_master"
20
+ Dir.chdir(vagrant_path) do
21
+ ShellSpinner 'Terminating Vagrant central-machine ' do
22
+ Open3.popen2('vagrant destroy -f') do |_stdin, output, wait|
23
+ while o = output.gets
24
+ puts o if ENV['DEBUG']
25
+ end
26
+ FileUtils.remove_entry_secure(vagrant_path) if wait.value == 0
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,79 @@
1
+ require 'fileutils'
2
+ require 'erb'
3
+ require 'open3'
4
+ require 'shell-spinner'
5
+
6
+ module Central
7
+ module Machine
8
+ module Vagrant
9
+ class MasterProvisioner
10
+ include RandomName
11
+
12
+ API_URL = 'http://192.168.66.100:8080'.freeze
13
+ attr_reader :client
14
+
15
+ def initialize
16
+ @client = Excon.new(API_URL)
17
+ end
18
+
19
+ def run!(opts)
20
+ name = generate_name
21
+ version = opts[:version]
22
+ memory = opts[:memory] || 1024
23
+ auth_server = opts[:auth_server]
24
+ vault_secret = opts[:vault_secret]
25
+ vault_iv = opts[:vault_iv]
26
+ vagrant_path = "#{Dir.home}/.central/vagrant_master/"
27
+ if Dir.exist?(vagrant_path)
28
+ abort('Oops... cannot create Central Machine! You can run only one Central Machine with Vagrant'.colorize(:red))
29
+ end
30
+ FileUtils.mkdir_p(vagrant_path)
31
+
32
+ template = File.join(__dir__, '/Vagrantfile.master.rb.erb')
33
+ cloudinit_template = File.join(__dir__, '/cloudinit.yml')
34
+ vars = {
35
+ name: name,
36
+ version: version,
37
+ memory: memory,
38
+ auth_server: auth_server,
39
+ vault_secret: vault_secret,
40
+ vault_iv: vault_iv,
41
+ cloudinit: "#{vagrant_path}/cloudinit.yml"
42
+ }
43
+ vagrant_data = erb(File.read(template), vars)
44
+ cloudinit = erb(File.read(cloudinit_template), vars)
45
+ File.write("#{vagrant_path}/Vagrantfile", vagrant_data)
46
+ File.write("#{vagrant_path}/cloudinit.yml", cloudinit)
47
+ Dir.chdir(vagrant_path) do
48
+ ShellSpinner "Creating Vagrant machine #{name.colorize(:cyan)} " do
49
+ Open3.popen2('vagrant box update && vagrant up') do |_stdin, output, _wait|
50
+ while o = output.gets
51
+ print o if ENV['DEBUG']
52
+ end
53
+ end
54
+ end
55
+ ShellSpinner "Waiting for #{name.colorize(:cyan)} to start " do
56
+ sleep 1 until master_running?
57
+ end
58
+ puts "Central Machine is now running at #{API_URL}"
59
+ puts "Use #{"cm login #{API_URL}".colorize(:light_black)} to complete Central Machine setup"
60
+ end
61
+ end
62
+
63
+ def erb(template, vars)
64
+ ERB.new(template).result(OpenStruct.new(vars).instance_eval { binding })
65
+ end
66
+
67
+ def master_running?
68
+ client.get(path: '/').status == 200
69
+ rescue
70
+ false
71
+ end
72
+
73
+ def generate_name
74
+ "central-machine-#{super}-#{rand(1..99)}"
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end