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,13 @@
1
+ begin
2
+ require 'azure'
3
+ rescue LoadError
4
+ puts "It seems that you don't have Azure SDK installed."
5
+ puts 'Install it using: gem install azure:0.7.0'
6
+ exit 1
7
+ end
8
+
9
+ require_relative 'random_name'
10
+ require_relative 'azure/logger'
11
+ require_relative 'azure/node_provisioner'
12
+ require_relative 'azure/node_destroyer'
13
+ require_relative 'azure/master_provisioner'
@@ -0,0 +1,64 @@
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
+ - path: /etc/resolv.conf
21
+ permissions: 0644
22
+ owner: root
23
+ content: |
24
+ nameserver 172.17.43.1
25
+ nameserver 8.8.8.8
26
+ nameserver 8.8.4.4
27
+ coreos:
28
+ units:
29
+ - name: 10-weave.network
30
+ runtime: false
31
+ content: |
32
+ [Match]
33
+ Type=bridge
34
+ Name=weave*
35
+
36
+ [Network]
37
+ - name: central-agent.service
38
+ command: start
39
+ enable: true
40
+ content: |
41
+ [Unit]
42
+ Description=central-agent
43
+ After=network-online.target
44
+ After=docker.service
45
+ Description=Central Agent
46
+ Documentation=http://www.central.io/
47
+ Requires=network-online.target
48
+ Requires=docker.service
49
+
50
+ [Service]
51
+ Restart=always
52
+ RestartSec=5
53
+ EnvironmentFile=/etc/central-agent.env
54
+ ExecStartPre=-/usr/bin/docker stop central-agent
55
+ ExecStartPre=-/usr/bin/docker rm central-agent
56
+ ExecStartPre=/usr/bin/docker pull fishyard/agent:${CENTRAL_VERSION}
57
+ ExecStart=/usr/bin/docker run --name central-agent \
58
+ -e CENTRAL_URI=${CENTRAL_URI} \
59
+ -e CENTRAL_TOKEN=${CENTRAL_TOKEN} \
60
+ -e CENTRAL_PEER_INTERFACE=${CENTRAL_PEER_INTERFACE} \
61
+ -v=/var/run/docker.sock:/var/run/docker.sock \
62
+ -v=/etc/central-agent.env:/etc/central.env \
63
+ --net=host \
64
+ fishyard/agent:${CENTRAL_VERSION}
@@ -0,0 +1,106 @@
1
+ #cloud-config
2
+ write_files:
3
+ - path: /etc/central-server.env
4
+ permissions: 0600
5
+ owner: root
6
+ content: |
7
+ CENTRAL_VERSION=<%= version %>
8
+ CENTRAL_VAULT_KEY=<%= vault_secret %>
9
+ CENTRAL_VAULT_IV=<%= vault_iv %>
10
+ <% if ssl_cert %>SSL_CERT="/etc/central-server.pem"
11
+
12
+ - path: /etc/central-server.pem
13
+ permissions: 0600
14
+ owner: root
15
+ content: | <% ssl_cert.split(/\n/).each do |row| %>
16
+ <%= row %><% end %><% end %>
17
+ - path: /opt/bin/central-haproxy.sh
18
+ permissions: 0755
19
+ owner: root
20
+ content: |
21
+ #!/bin/sh
22
+ if [ -n "$SSL_CERT" ]; then
23
+ SSL_CERT=$(awk 1 ORS='\\n' $SSL_CERT)
24
+ else
25
+ SSL_CERT="**None**"
26
+ fi
27
+ /usr/bin/docker run --name=central-server-haproxy \
28
+ --link central-server-api:central-server-api \
29
+ -e SSL_CERT="$SSL_CERT" \
30
+ -p 80:80 -p 443:443 fishyard/haproxy:latest
31
+ coreos:
32
+ units:
33
+ - name: central-server-mongo.service
34
+ command: start
35
+ enable: true
36
+ content: |
37
+ [Unit]
38
+ Description=central-server-mongo
39
+ After=network-online.target
40
+ After=docker.service
41
+ Description=Central Server MongoDB
42
+ Documentation=http://www.mongodb.org/
43
+ Requires=network-online.target
44
+ Requires=docker.service
45
+
46
+ [Service]
47
+ Restart=always
48
+ RestartSec=5
49
+ ExecStartPre=/usr/bin/docker pull mongo:3.0
50
+ ExecStartPre=-/usr/bin/docker create --name=central-server-mongo-data mongo:3.0
51
+ ExecStartPre=-/usr/bin/docker stop central-server-mongo
52
+ ExecStartPre=-/usr/bin/docker rm central-server-mongo
53
+ ExecStart=/usr/bin/docker run --name=central-server-mongo \
54
+ --volumes-from=central-server-mongo-data \
55
+ mongo:3.0 mongod --smallfiles
56
+
57
+ - name: central-server-api.service
58
+ command: start
59
+ enable: true
60
+ content: |
61
+ [Unit]
62
+ Description=central-server-api
63
+ After=network-online.target
64
+ After=docker.service
65
+ After=central-server-mongo.service
66
+ Description=Central Machine
67
+ Documentation=http://www.central.io/
68
+ Requires=network-online.target
69
+ Requires=docker.service
70
+ Requires=central-server-mongo.service
71
+
72
+ [Service]
73
+ Restart=always
74
+ RestartSec=5
75
+ EnvironmentFile=/etc/central-server.env
76
+ ExecStartPre=-/usr/bin/docker stop central-server-api
77
+ ExecStartPre=-/usr/bin/docker rm central-server-api
78
+ ExecStartPre=/usr/bin/docker pull fishyard/server:${CENTRAL_VERSION}
79
+ ExecStart=/usr/bin/docker run --name central-server-api \
80
+ --link central-server-mongo:mongodb \
81
+ -e MONGODB_URI=mongodb://mongodb:27017/central_server \
82
+ -e VAULT_KEY=${CENTRAL_VAULT_KEY} -e VAULT_IV=${CENTRAL_VAULT_IV} \
83
+ <% if auth_server %>-e AUTH_API_URL=<%= auth_server %><% end %> \
84
+ fishyard/server:${CENTRAL_VERSION}
85
+
86
+ - name: central-server-haproxy.service
87
+ command: start
88
+ enable: true
89
+ content: |
90
+ [Unit]
91
+ Description=central-server-haproxy
92
+ After=network-online.target
93
+ After=docker.service
94
+ Description=Central Server HAProxy
95
+ Documentation=http://www.central.io/
96
+ Requires=network-online.target
97
+ Requires=docker.service
98
+
99
+ [Service]
100
+ Restart=always
101
+ RestartSec=5
102
+ EnvironmentFile=/etc/central-server.env
103
+ ExecStartPre=-/usr/bin/docker stop central-server-haproxy
104
+ ExecStartPre=-/usr/bin/docker rm central-server-haproxy
105
+ ExecStartPre=/usr/bin/docker pull fishyard/haproxy:latest
106
+ ExecStart=/opt/bin/central-haproxy.sh
@@ -0,0 +1,26 @@
1
+ module Central
2
+ module Machine
3
+ module Azure
4
+ class Logger
5
+ def info(msg)
6
+ end
7
+
8
+ def error_with_exit(msg)
9
+ puts msg.colorize(:red)
10
+ end
11
+
12
+ def warn(msg)
13
+ puts msg.colorize(:yellow)
14
+ end
15
+
16
+ def error(msg)
17
+ puts msg.colorize(:red)
18
+ end
19
+
20
+ def exception_message(msg)
21
+ puts msg.colorize(:red)
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,125 @@
1
+ require 'fileutils'
2
+ require 'erb'
3
+ require 'open3'
4
+ require 'shell-spinner'
5
+
6
+ module Central
7
+ module Machine
8
+ module Azure
9
+ class MasterProvisioner
10
+ include RandomName
11
+
12
+ attr_reader :client, :http_client
13
+
14
+ # @param [String] subscription_id Azure subscription id
15
+ # @param [String] certificate Path to Azure management certificate
16
+ def initialize(subscription_id, certificate)
17
+ abort('Invalid management certificate') unless File.exist?(File.expand_path(certificate))
18
+
19
+ @client = ::Azure
20
+ client.management_certificate = certificate
21
+ client.subscription_id = subscription_id
22
+ client.vm_management.initialize_external_logger(Logger.new) # We don't want all the output
23
+ end
24
+
25
+ def run!(opts)
26
+ abort('Invalid ssh key') unless File.exist?(File.expand_path(opts[:ssh_key]))
27
+ if opts[:ssl_cert]
28
+ abort('Invalid ssl cert') unless File.exist?(File.expand_path(opts[:ssl_cert]))
29
+ ssl_cert = File.read(File.expand_path(opts[:ssl_cert]))
30
+ end
31
+ cloud_service_name = generate_cloud_service_name
32
+ vm_name = cloud_service_name
33
+ master_url = ''
34
+ ShellSpinner "Creating Azure Virtual Machine #{vm_name.colorize(:cyan)}" do
35
+ if opts[:virtual_network].nil?
36
+ location = opts[:location].downcase.tr(' ', '-')
37
+ default_network_name = "central-#{location}"
38
+ create_virtual_network(default_network_name, opts[:location]) unless virtual_network_exist?(default_network_name)
39
+ opts[:virtual_network] = default_network_name
40
+ opts[:subnet] = 'subnet-1'
41
+ end
42
+
43
+ userdata_vars = {
44
+ ssl_cert: ssl_cert,
45
+ auth_server: opts[:auth_server],
46
+ version: opts[:version],
47
+ vault_secret: opts[:vault_secret],
48
+ vault_iv: opts[:vault_iv]
49
+ }
50
+
51
+ params = {
52
+ vm_name: vm_name,
53
+ vm_user: 'core',
54
+ location: opts[:location],
55
+ image: '2b171e93f07c4903bcad35bda10acf22__CoreOS-Stable-766.3.0',
56
+ custom_data: Base64.encode64(user_data(userdata_vars)),
57
+ ssh_key: opts[:ssh_key]
58
+ }
59
+
60
+ options = {
61
+ cloud_service_name: cloud_service_name,
62
+ deployment_name: vm_name,
63
+ virtual_network_name: opts[:virtual_network],
64
+ subnet_name: opts[:subnet],
65
+ tcp_endpoints: '80,443',
66
+ private_key_file: opts[:ssh_key],
67
+ ssh_port: 22,
68
+ vm_size: opts[:size]
69
+ }
70
+
71
+ virtual_machine = client.vm_management.create_virtual_machine(params, options)
72
+
73
+ master_url = if opts[:ssl_cert]
74
+ "https://#{virtual_machine.ipaddress}"
75
+ else
76
+ "http://#{virtual_machine.ipaddress}"
77
+ end
78
+ end
79
+ Excon.defaults[:ssl_verify_peer] = false
80
+ @http_client = Excon.new(master_url.to_s, connect_timeout: 10)
81
+
82
+ ShellSpinner "Waiting for #{vm_name.colorize(:cyan)} to start" do
83
+ sleep 5 until master_running?
84
+ end
85
+
86
+ puts "Central Machine is now running at #{master_url}"
87
+ puts "Use #{"cm login #{master_url}".colorize(:light_black)} to complete Central Machine setup"
88
+ end
89
+
90
+ def erb(template, vars)
91
+ ERB.new(template).result(OpenStruct.new(vars).instance_eval { binding })
92
+ end
93
+
94
+ def user_data(vars)
95
+ cloudinit_template = File.join(__dir__, '/cloudinit_master.yml')
96
+ erb(File.read(cloudinit_template), vars)
97
+ end
98
+
99
+ def master_running?
100
+ http_client.get(path: '/').status == 200
101
+ rescue
102
+ false
103
+ end
104
+
105
+ def generate_cloud_service_name
106
+ "central-machine-#{generate_name}-#{rand(1..99)}"
107
+ end
108
+
109
+ def cloud_service(name)
110
+ client.cloud_service_management.get_cloud_service(name)
111
+ end
112
+
113
+ def virtual_network_exist?(name)
114
+ client.network_management.list_virtual_networks.find { |n| n.name == name }
115
+ end
116
+
117
+ def create_virtual_network(name, location)
118
+ address_space = ['10.0.0.0/20']
119
+ options = { subnet: [{ name: 'subnet-1', ip_address: '10.0.0.0', cidr: 23 }] }
120
+ client.network_management.set_network_configuration(name, location, address_space, options)
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,52 @@
1
+ require 'shell-spinner'
2
+ require 'azure/virtual_machine_image_management/virtual_machine_image_management_service'
3
+
4
+ module Central
5
+ module Machine
6
+ module Azure
7
+ class NodeDestroyer
8
+ attr_reader :client, :api_client
9
+
10
+ # @param [Central::Client] api_client Central api client
11
+ # @param [String] subscription_id Azure subscription id
12
+ # @param [String] certificate Path to Azure management certificate
13
+ def initialize(api_client, subscription_id, certificate)
14
+ @api_client = api_client
15
+ abort('Invalid management certificate') unless File.exist?(File.expand_path(certificate))
16
+
17
+ @client = ::Azure
18
+ client.management_certificate = certificate
19
+ client.subscription_id = subscription_id
20
+ client.vm_management.initialize_external_logger(Logger.new) # We don't want all the output
21
+ end
22
+
23
+ def run!(stack, name)
24
+ ShellSpinner "Terminating Azure Virtual Machine #{name.colorize(:cyan)} " do
25
+ vm = client.vm_management.get_virtual_machine(name, cloud_service_name(name, stack['name']))
26
+ if vm
27
+ out = StringIO.new
28
+ $stdout = out # to avoid debug data (https://github.com/Azure/azure-sdk-for-ruby/issues/200)
29
+ client.vm_management.delete_virtual_machine(name, cloud_service_name(name, stack['name']))
30
+ storage_account = client.storage_management.list_storage_accounts.find { |a| a.label == cloud_service_name(name, stack['name']) }
31
+ client.storage_management.delete_storage_account(storage_account.name) if storage_account
32
+ $stdout = STDOUT
33
+ else
34
+ abort "\nCannot find Virtual Machine #{name.colorize(:cyan)} in Azure"
35
+ end
36
+ end
37
+
38
+ node = api_client.get("stacks/#{stack['id']}/nodes")['nodes'].find { |n| n['name'] == name }
39
+ if node
40
+ ShellSpinner "Removing node #{name.colorize(:cyan)} from stack #{stack['name'].colorize(:cyan)} " do
41
+ api_client.delete("stacks/#{stack['id']}/nodes/#{name}")
42
+ end
43
+ end
44
+ end
45
+
46
+ def cloud_service_name(vm_name, stack)
47
+ "central-#{stack}-#{vm_name}"
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,126 @@
1
+ require 'fileutils'
2
+ require 'erb'
3
+ require 'open3'
4
+ require 'base64'
5
+ require 'shell-spinner'
6
+
7
+ module Central
8
+ module Machine
9
+ module Azure
10
+ class NodeProvisioner
11
+ include RandomName
12
+
13
+ attr_reader :client, :api_client
14
+
15
+ # @param [Central::Client] api_client Central api client
16
+ # @param [String] subscription_id Azure subscription id
17
+ # @param [String] certificate Path to Azure management certificate
18
+ def initialize(api_client, subscription_id, certificate)
19
+ @api_client = api_client
20
+ abort('Invalid management certificate') unless File.exist?(File.expand_path(certificate))
21
+
22
+ @client = ::Azure
23
+ client.management_certificate = certificate
24
+ client.subscription_id = subscription_id
25
+ client.vm_management.initialize_external_logger(Logger.new) # We don't want all the output
26
+ end
27
+
28
+ def run!(opts)
29
+ abort('Invalid ssh key') unless File.exist?(File.expand_path(opts[:ssh_key]))
30
+ node = nil
31
+ vm_name = opts[:name] || generate_name
32
+ cloud_service_name = generate_cloud_service_name(vm_name, opts[:stack])
33
+
34
+ ShellSpinner "Creating Azure Virtual Machine #{vm_name.colorize(:cyan)}" do
35
+ if opts[:virtual_network].nil?
36
+ location = opts[:location].downcase.tr(' ', '-')
37
+ default_network_name = "central-#{location}"
38
+ create_virtual_network(default_network_name, opts[:location]) unless virtual_network_exist?(default_network_name)
39
+ opts[:virtual_network] = default_network_name
40
+ opts[:subnet] = 'subnet-1'
41
+ end
42
+
43
+ userdata_vars = {
44
+ version: opts[:version],
45
+ master_uri: opts[:master_uri],
46
+ stack_token: opts[:stack_token]
47
+ }
48
+
49
+ params = {
50
+ vm_name: vm_name,
51
+ vm_user: 'core',
52
+ location: opts[:location],
53
+ image: '2b171e93f07c4903bcad35bda10acf22__CoreOS-Stable-766.3.0',
54
+ custom_data: Base64.encode64(user_data(userdata_vars)),
55
+ ssh_key: opts[:ssh_key]
56
+ }
57
+ options = {
58
+ cloud_service_name: cloud_service_name,
59
+ deployment_name: vm_name,
60
+ virtual_network_name: opts[:virtual_network],
61
+ subnet_name: opts[:subnet],
62
+ tcp_endpoints: '80',
63
+ private_key_file: opts[:ssh_key],
64
+ ssh_port: 22,
65
+ vm_size: opts[:size]
66
+ }
67
+
68
+ client.vm_management.create_virtual_machine(params, options)
69
+ end
70
+ ShellSpinner "Waiting for node #{vm_name.colorize(:cyan)} join to stack #{opts[:stack].colorize(:cyan)} " do
71
+ sleep 2 until node = vm_exists_in_stack?(opts[:stack], vm_name)
72
+ end
73
+ if node
74
+ labels = ["region=#{cloud_service(cloud_service_name).location}"]
75
+ set_labels(node, labels)
76
+ end
77
+ end
78
+
79
+ def user_data(vars)
80
+ cloudinit_template = File.join(__dir__, '/cloudinit.yml')
81
+ erb(File.read(cloudinit_template), vars)
82
+ end
83
+
84
+ def generate_name
85
+ "#{super}-#{rand(1..99)}"
86
+ end
87
+
88
+ def generate_cloud_service_name(name, stack)
89
+ "central-#{stack}-#{name}"
90
+ end
91
+
92
+ def vm_exists_in_stack?(stack, name)
93
+ api_client.get("stacks/#{stack}/nodes")['nodes'].find { |n| n['name'] == name }
94
+ end
95
+
96
+ def erb(template, vars)
97
+ ERB.new(template).result(OpenStruct.new(vars).instance_eval { binding })
98
+ end
99
+
100
+ def cloud_service_exist?(name)
101
+ cloud_service(name)
102
+ end
103
+
104
+ def cloud_service(name)
105
+ client.cloud_service_management.get_cloud_service(name)
106
+ end
107
+
108
+ def virtual_network_exist?(name)
109
+ client.network_management.list_virtual_networks.find { |n| n.name == name }
110
+ end
111
+
112
+ def create_virtual_network(name, location)
113
+ address_space = ['10.0.0.0/20']
114
+ options = { subnet: [{ name: 'subnet-1', ip_address: '10.0.0.0', cidr: 23 }] }
115
+ client.network_management.set_network_configuration(name, location, address_space, options)
116
+ end
117
+
118
+ def set_labels(node, labels)
119
+ data = {}
120
+ data[:labels] = labels
121
+ api_client.put("nodes/#{node['id']}", data, {}, 'Central-Stack-Token' => node['stack']['token'])
122
+ end
123
+ end
124
+ end
125
+ end
126
+ end