cloud-mu 2.1.0beta → 3.0.0beta

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 (291) hide show
  1. checksums.yaml +5 -5
  2. data/Berksfile +4 -5
  3. data/Berksfile.lock +179 -0
  4. data/README.md +1 -6
  5. data/ansible/roles/geerlingguy.firewall/templates/firewall.bash.j2 +0 -0
  6. data/ansible/roles/mu-installer/README.md +33 -0
  7. data/ansible/roles/mu-installer/defaults/main.yml +2 -0
  8. data/ansible/roles/mu-installer/handlers/main.yml +2 -0
  9. data/ansible/roles/mu-installer/meta/main.yml +60 -0
  10. data/ansible/roles/mu-installer/tasks/main.yml +13 -0
  11. data/ansible/roles/mu-installer/tests/inventory +2 -0
  12. data/ansible/roles/mu-installer/tests/test.yml +5 -0
  13. data/ansible/roles/mu-installer/vars/main.yml +2 -0
  14. data/bin/mu-adopt +125 -0
  15. data/bin/mu-aws-setup +4 -4
  16. data/bin/mu-azure-setup +265 -0
  17. data/bin/mu-azure-tests +43 -0
  18. data/bin/mu-cleanup +20 -8
  19. data/bin/mu-configure +224 -98
  20. data/bin/mu-deploy +8 -3
  21. data/bin/mu-gcp-setup +16 -8
  22. data/bin/mu-gen-docs +92 -8
  23. data/bin/mu-load-config.rb +52 -12
  24. data/bin/mu-momma-cat +36 -0
  25. data/bin/mu-node-manage +34 -27
  26. data/bin/mu-self-update +2 -2
  27. data/bin/mu-ssh +12 -8
  28. data/bin/mu-upload-chef-artifacts +11 -4
  29. data/bin/mu-user-manage +3 -0
  30. data/cloud-mu.gemspec +8 -11
  31. data/cookbooks/firewall/libraries/helpers_iptables.rb +2 -2
  32. data/cookbooks/firewall/metadata.json +1 -1
  33. data/cookbooks/firewall/recipes/default.rb +5 -9
  34. data/cookbooks/mu-firewall/attributes/default.rb +2 -0
  35. data/cookbooks/mu-firewall/metadata.rb +1 -1
  36. data/cookbooks/mu-glusterfs/templates/default/mu-gluster-client.erb +0 -0
  37. data/cookbooks/mu-master/Berksfile +2 -2
  38. data/cookbooks/mu-master/files/default/check_mem.pl +0 -0
  39. data/cookbooks/mu-master/files/default/cloudamatic.png +0 -0
  40. data/cookbooks/mu-master/metadata.rb +5 -4
  41. data/cookbooks/mu-master/recipes/389ds.rb +1 -1
  42. data/cookbooks/mu-master/recipes/basepackages.rb +30 -10
  43. data/cookbooks/mu-master/recipes/default.rb +59 -7
  44. data/cookbooks/mu-master/recipes/firewall-holes.rb +1 -1
  45. data/cookbooks/mu-master/recipes/init.rb +65 -47
  46. data/cookbooks/mu-master/recipes/{eks-kubectl.rb → kubectl.rb} +4 -10
  47. data/cookbooks/mu-master/recipes/sssd.rb +2 -1
  48. data/cookbooks/mu-master/recipes/update_nagios_only.rb +6 -6
  49. data/cookbooks/mu-master/templates/default/web_app.conf.erb +2 -2
  50. data/cookbooks/mu-master/templates/mods/ldap.conf.erb +4 -0
  51. data/cookbooks/mu-php54/Berksfile +1 -2
  52. data/cookbooks/mu-php54/metadata.rb +4 -5
  53. data/cookbooks/mu-php54/recipes/default.rb +1 -1
  54. data/cookbooks/mu-splunk/templates/default/splunk-init.erb +0 -0
  55. data/cookbooks/mu-tools/Berksfile +3 -2
  56. data/cookbooks/mu-tools/files/default/Mu_CA.pem +33 -0
  57. data/cookbooks/mu-tools/libraries/helper.rb +20 -8
  58. data/cookbooks/mu-tools/metadata.rb +5 -2
  59. data/cookbooks/mu-tools/recipes/apply_security.rb +2 -3
  60. data/cookbooks/mu-tools/recipes/eks.rb +1 -1
  61. data/cookbooks/mu-tools/recipes/gcloud.rb +5 -30
  62. data/cookbooks/mu-tools/recipes/nagios.rb +1 -1
  63. data/cookbooks/mu-tools/recipes/rsyslog.rb +1 -0
  64. data/cookbooks/mu-tools/recipes/selinux.rb +19 -0
  65. data/cookbooks/mu-tools/recipes/split_var_partitions.rb +0 -1
  66. data/cookbooks/mu-tools/recipes/windows-client.rb +256 -122
  67. data/cookbooks/mu-tools/resources/disk.rb +3 -1
  68. data/cookbooks/mu-tools/templates/amazon/sshd_config.erb +1 -1
  69. data/cookbooks/mu-tools/templates/default/etc_hosts.erb +1 -1
  70. data/cookbooks/mu-tools/templates/default/{kubeconfig.erb → kubeconfig-eks.erb} +0 -0
  71. data/cookbooks/mu-tools/templates/default/kubeconfig-gke.erb +27 -0
  72. data/cookbooks/mu-tools/templates/windows-10/sshd_config.erb +137 -0
  73. data/cookbooks/mu-utility/recipes/nat.rb +4 -0
  74. data/extras/alpha.png +0 -0
  75. data/extras/beta.png +0 -0
  76. data/extras/clean-stock-amis +2 -2
  77. data/extras/generate-stock-images +131 -0
  78. data/extras/git-fix-permissions-hook +0 -0
  79. data/extras/image-generators/AWS/centos6.yaml +17 -0
  80. data/extras/image-generators/{aws → AWS}/centos7-govcloud.yaml +0 -0
  81. data/extras/image-generators/{aws → AWS}/centos7.yaml +0 -0
  82. data/extras/image-generators/{aws → AWS}/rhel7.yaml +0 -0
  83. data/extras/image-generators/{aws → AWS}/win2k12.yaml +0 -0
  84. data/extras/image-generators/{aws → AWS}/win2k16.yaml +0 -0
  85. data/extras/image-generators/{aws → AWS}/windows.yaml +0 -0
  86. data/extras/image-generators/{gcp → Google}/centos6.yaml +1 -0
  87. data/extras/image-generators/Google/centos7.yaml +18 -0
  88. data/extras/python_rpm/build.sh +0 -0
  89. data/extras/release.png +0 -0
  90. data/extras/ruby_rpm/build.sh +0 -0
  91. data/extras/ruby_rpm/muby.spec +1 -1
  92. data/install/README.md +43 -5
  93. data/install/deprecated-bash-library.sh +0 -0
  94. data/install/installer +1 -1
  95. data/install/jenkinskeys.rb +0 -0
  96. data/install/mu-master.yaml +55 -0
  97. data/modules/mommacat.ru +41 -7
  98. data/modules/mu.rb +444 -149
  99. data/modules/mu/adoption.rb +500 -0
  100. data/modules/mu/cleanup.rb +235 -158
  101. data/modules/mu/cloud.rb +675 -138
  102. data/modules/mu/clouds/aws.rb +156 -24
  103. data/modules/mu/clouds/aws/alarm.rb +4 -14
  104. data/modules/mu/clouds/aws/bucket.rb +60 -18
  105. data/modules/mu/clouds/aws/cache_cluster.rb +8 -20
  106. data/modules/mu/clouds/aws/collection.rb +12 -22
  107. data/modules/mu/clouds/aws/container_cluster.rb +209 -118
  108. data/modules/mu/clouds/aws/database.rb +120 -45
  109. data/modules/mu/clouds/aws/dnszone.rb +7 -18
  110. data/modules/mu/clouds/aws/endpoint.rb +5 -15
  111. data/modules/mu/clouds/aws/firewall_rule.rb +144 -72
  112. data/modules/mu/clouds/aws/folder.rb +4 -11
  113. data/modules/mu/clouds/aws/function.rb +6 -16
  114. data/modules/mu/clouds/aws/group.rb +4 -12
  115. data/modules/mu/clouds/aws/habitat.rb +11 -13
  116. data/modules/mu/clouds/aws/loadbalancer.rb +40 -28
  117. data/modules/mu/clouds/aws/log.rb +5 -13
  118. data/modules/mu/clouds/aws/msg_queue.rb +9 -24
  119. data/modules/mu/clouds/aws/nosqldb.rb +4 -12
  120. data/modules/mu/clouds/aws/notifier.rb +6 -13
  121. data/modules/mu/clouds/aws/role.rb +69 -40
  122. data/modules/mu/clouds/aws/search_domain.rb +17 -20
  123. data/modules/mu/clouds/aws/server.rb +184 -94
  124. data/modules/mu/clouds/aws/server_pool.rb +33 -38
  125. data/modules/mu/clouds/aws/storage_pool.rb +5 -12
  126. data/modules/mu/clouds/aws/user.rb +59 -33
  127. data/modules/mu/clouds/aws/userdata/linux.erb +18 -30
  128. data/modules/mu/clouds/aws/userdata/windows.erb +9 -9
  129. data/modules/mu/clouds/aws/vpc.rb +214 -145
  130. data/modules/mu/clouds/azure.rb +978 -44
  131. data/modules/mu/clouds/azure/container_cluster.rb +413 -0
  132. data/modules/mu/clouds/azure/firewall_rule.rb +500 -0
  133. data/modules/mu/clouds/azure/habitat.rb +167 -0
  134. data/modules/mu/clouds/azure/loadbalancer.rb +205 -0
  135. data/modules/mu/clouds/azure/role.rb +211 -0
  136. data/modules/mu/clouds/azure/server.rb +810 -0
  137. data/modules/mu/clouds/azure/user.rb +257 -0
  138. data/modules/mu/clouds/azure/userdata/README.md +4 -0
  139. data/modules/mu/clouds/azure/userdata/linux.erb +137 -0
  140. data/modules/mu/clouds/azure/userdata/windows.erb +275 -0
  141. data/modules/mu/clouds/azure/vpc.rb +782 -0
  142. data/modules/mu/clouds/cloudformation.rb +12 -9
  143. data/modules/mu/clouds/cloudformation/firewall_rule.rb +5 -13
  144. data/modules/mu/clouds/cloudformation/server.rb +10 -1
  145. data/modules/mu/clouds/cloudformation/server_pool.rb +1 -0
  146. data/modules/mu/clouds/cloudformation/vpc.rb +0 -2
  147. data/modules/mu/clouds/google.rb +554 -117
  148. data/modules/mu/clouds/google/bucket.rb +173 -32
  149. data/modules/mu/clouds/google/container_cluster.rb +1112 -157
  150. data/modules/mu/clouds/google/database.rb +24 -47
  151. data/modules/mu/clouds/google/firewall_rule.rb +344 -89
  152. data/modules/mu/clouds/google/folder.rb +156 -79
  153. data/modules/mu/clouds/google/group.rb +272 -82
  154. data/modules/mu/clouds/google/habitat.rb +177 -52
  155. data/modules/mu/clouds/google/loadbalancer.rb +9 -34
  156. data/modules/mu/clouds/google/role.rb +1211 -0
  157. data/modules/mu/clouds/google/server.rb +491 -227
  158. data/modules/mu/clouds/google/server_pool.rb +233 -48
  159. data/modules/mu/clouds/google/user.rb +479 -125
  160. data/modules/mu/clouds/google/userdata/linux.erb +3 -3
  161. data/modules/mu/clouds/google/userdata/windows.erb +9 -9
  162. data/modules/mu/clouds/google/vpc.rb +381 -223
  163. data/modules/mu/config.rb +689 -214
  164. data/modules/mu/config/bucket.rb +1 -1
  165. data/modules/mu/config/cache_cluster.rb +1 -1
  166. data/modules/mu/config/cache_cluster.yml +0 -4
  167. data/modules/mu/config/container_cluster.rb +18 -9
  168. data/modules/mu/config/database.rb +6 -23
  169. data/modules/mu/config/firewall_rule.rb +9 -15
  170. data/modules/mu/config/folder.rb +22 -21
  171. data/modules/mu/config/habitat.rb +22 -21
  172. data/modules/mu/config/loadbalancer.rb +2 -2
  173. data/modules/mu/config/role.rb +9 -40
  174. data/modules/mu/config/server.rb +26 -5
  175. data/modules/mu/config/server_pool.rb +1 -1
  176. data/modules/mu/config/storage_pool.rb +2 -2
  177. data/modules/mu/config/user.rb +4 -0
  178. data/modules/mu/config/vpc.rb +350 -110
  179. data/modules/mu/defaults/{amazon_images.yaml → AWS.yaml} +37 -39
  180. data/modules/mu/defaults/Azure.yaml +17 -0
  181. data/modules/mu/defaults/Google.yaml +24 -0
  182. data/modules/mu/defaults/README.md +1 -1
  183. data/modules/mu/deploy.rb +168 -125
  184. data/modules/mu/groomer.rb +2 -1
  185. data/modules/mu/groomers/ansible.rb +104 -32
  186. data/modules/mu/groomers/chef.rb +96 -44
  187. data/modules/mu/kittens.rb +20602 -0
  188. data/modules/mu/logger.rb +38 -11
  189. data/modules/mu/master.rb +90 -8
  190. data/modules/mu/master/chef.rb +2 -3
  191. data/modules/mu/master/ldap.rb +0 -1
  192. data/modules/mu/master/ssl.rb +250 -0
  193. data/modules/mu/mommacat.rb +917 -513
  194. data/modules/scratchpad.erb +1 -1
  195. data/modules/tests/super_complex_bok.yml +0 -0
  196. data/modules/tests/super_simple_bok.yml +0 -0
  197. data/roles/mu-master.json +2 -1
  198. data/spec/azure_creds +5 -0
  199. data/spec/mu.yaml +56 -0
  200. data/spec/mu/clouds/azure_spec.rb +164 -27
  201. data/spec/spec_helper.rb +5 -0
  202. data/test/clean_up.py +0 -0
  203. data/test/exec_inspec.py +0 -0
  204. data/test/exec_mu_install.py +0 -0
  205. data/test/exec_retry.py +0 -0
  206. data/test/smoke_test.rb +0 -0
  207. metadata +90 -118
  208. data/cookbooks/mu-jenkins/Berksfile +0 -14
  209. data/cookbooks/mu-jenkins/CHANGELOG.md +0 -13
  210. data/cookbooks/mu-jenkins/LICENSE +0 -37
  211. data/cookbooks/mu-jenkins/README.md +0 -105
  212. data/cookbooks/mu-jenkins/attributes/default.rb +0 -42
  213. data/cookbooks/mu-jenkins/files/default/cleanup_deploy_config.xml +0 -73
  214. data/cookbooks/mu-jenkins/files/default/deploy_config.xml +0 -44
  215. data/cookbooks/mu-jenkins/metadata.rb +0 -21
  216. data/cookbooks/mu-jenkins/recipes/default.rb +0 -195
  217. data/cookbooks/mu-jenkins/recipes/node-ssh-config.rb +0 -54
  218. data/cookbooks/mu-jenkins/recipes/public_key.rb +0 -24
  219. data/cookbooks/mu-jenkins/templates/default/example_job.config.xml.erb +0 -24
  220. data/cookbooks/mu-jenkins/templates/default/org.jvnet.hudson.plugins.SSHBuildWrapper.xml.erb +0 -14
  221. data/cookbooks/mu-jenkins/templates/default/ssh_config.erb +0 -6
  222. data/cookbooks/nagios/Berksfile +0 -11
  223. data/cookbooks/nagios/CHANGELOG.md +0 -589
  224. data/cookbooks/nagios/CONTRIBUTING.md +0 -11
  225. data/cookbooks/nagios/LICENSE +0 -37
  226. data/cookbooks/nagios/README.md +0 -328
  227. data/cookbooks/nagios/TESTING.md +0 -2
  228. data/cookbooks/nagios/attributes/config.rb +0 -171
  229. data/cookbooks/nagios/attributes/default.rb +0 -228
  230. data/cookbooks/nagios/chefignore +0 -102
  231. data/cookbooks/nagios/definitions/command.rb +0 -33
  232. data/cookbooks/nagios/definitions/contact.rb +0 -33
  233. data/cookbooks/nagios/definitions/contactgroup.rb +0 -33
  234. data/cookbooks/nagios/definitions/host.rb +0 -33
  235. data/cookbooks/nagios/definitions/hostdependency.rb +0 -33
  236. data/cookbooks/nagios/definitions/hostescalation.rb +0 -34
  237. data/cookbooks/nagios/definitions/hostgroup.rb +0 -33
  238. data/cookbooks/nagios/definitions/nagios_conf.rb +0 -38
  239. data/cookbooks/nagios/definitions/resource.rb +0 -33
  240. data/cookbooks/nagios/definitions/service.rb +0 -33
  241. data/cookbooks/nagios/definitions/servicedependency.rb +0 -33
  242. data/cookbooks/nagios/definitions/serviceescalation.rb +0 -34
  243. data/cookbooks/nagios/definitions/servicegroup.rb +0 -33
  244. data/cookbooks/nagios/definitions/timeperiod.rb +0 -33
  245. data/cookbooks/nagios/libraries/base.rb +0 -314
  246. data/cookbooks/nagios/libraries/command.rb +0 -91
  247. data/cookbooks/nagios/libraries/contact.rb +0 -230
  248. data/cookbooks/nagios/libraries/contactgroup.rb +0 -112
  249. data/cookbooks/nagios/libraries/custom_option.rb +0 -36
  250. data/cookbooks/nagios/libraries/data_bag_helper.rb +0 -23
  251. data/cookbooks/nagios/libraries/default.rb +0 -90
  252. data/cookbooks/nagios/libraries/host.rb +0 -412
  253. data/cookbooks/nagios/libraries/hostdependency.rb +0 -181
  254. data/cookbooks/nagios/libraries/hostescalation.rb +0 -173
  255. data/cookbooks/nagios/libraries/hostgroup.rb +0 -119
  256. data/cookbooks/nagios/libraries/nagios.rb +0 -282
  257. data/cookbooks/nagios/libraries/resource.rb +0 -59
  258. data/cookbooks/nagios/libraries/service.rb +0 -455
  259. data/cookbooks/nagios/libraries/servicedependency.rb +0 -215
  260. data/cookbooks/nagios/libraries/serviceescalation.rb +0 -195
  261. data/cookbooks/nagios/libraries/servicegroup.rb +0 -144
  262. data/cookbooks/nagios/libraries/timeperiod.rb +0 -160
  263. data/cookbooks/nagios/libraries/users_helper.rb +0 -54
  264. data/cookbooks/nagios/metadata.rb +0 -25
  265. data/cookbooks/nagios/recipes/_load_databag_config.rb +0 -153
  266. data/cookbooks/nagios/recipes/_load_default_config.rb +0 -241
  267. data/cookbooks/nagios/recipes/apache.rb +0 -48
  268. data/cookbooks/nagios/recipes/default.rb +0 -204
  269. data/cookbooks/nagios/recipes/nginx.rb +0 -82
  270. data/cookbooks/nagios/recipes/pagerduty.rb +0 -143
  271. data/cookbooks/nagios/recipes/server_package.rb +0 -40
  272. data/cookbooks/nagios/recipes/server_source.rb +0 -164
  273. data/cookbooks/nagios/templates/default/apache2.conf.erb +0 -96
  274. data/cookbooks/nagios/templates/default/cgi.cfg.erb +0 -266
  275. data/cookbooks/nagios/templates/default/commands.cfg.erb +0 -13
  276. data/cookbooks/nagios/templates/default/contacts.cfg.erb +0 -37
  277. data/cookbooks/nagios/templates/default/hostgroups.cfg.erb +0 -25
  278. data/cookbooks/nagios/templates/default/hosts.cfg.erb +0 -15
  279. data/cookbooks/nagios/templates/default/htpasswd.users.erb +0 -6
  280. data/cookbooks/nagios/templates/default/nagios.cfg.erb +0 -22
  281. data/cookbooks/nagios/templates/default/nginx.conf.erb +0 -62
  282. data/cookbooks/nagios/templates/default/pagerduty.cgi.erb +0 -185
  283. data/cookbooks/nagios/templates/default/resource.cfg.erb +0 -27
  284. data/cookbooks/nagios/templates/default/servicedependencies.cfg.erb +0 -15
  285. data/cookbooks/nagios/templates/default/servicegroups.cfg.erb +0 -14
  286. data/cookbooks/nagios/templates/default/services.cfg.erb +0 -14
  287. data/cookbooks/nagios/templates/default/templates.cfg.erb +0 -31
  288. data/cookbooks/nagios/templates/default/timeperiods.cfg.erb +0 -13
  289. data/extras/image-generators/aws/centos6.yaml +0 -18
  290. data/modules/mu/defaults/google_images.yaml +0 -16
  291. data/roles/mu-master-jenkins.json +0 -24
@@ -1,5 +1,5 @@
1
1
  ---
2
- rhel71: &rhel71
2
+ rhel71: &4
3
3
  us-east-1: ami-001ac4e5f414fc5b7
4
4
  ap-northeast-1: ami-0094aa64967e9267d
5
5
  ap-northeast-2: ami-072783bf50ca01ef7
@@ -16,24 +16,24 @@ rhel71: &rhel71
16
16
  us-east-2: ami-00cc9f964320129d7
17
17
  us-west-1: ami-0110a4f8a96b24369
18
18
  us-west-2: ami-0006d7ea260e40777
19
- centos6: &centos6
20
- us-east-1: ami-02f468ed191eda16e
21
- ap-northeast-1: ami-0211c03a05f62bd88
22
- ap-northeast-2: ami-0c4e210038a6c79a0
23
- ap-south-1: ami-0679b5acba08097b4
24
- ap-southeast-1: ami-0d06903ec09d67b84
25
- ap-southeast-2: ami-07fcb5609d11b08c2
26
- ca-central-1: ami-0090ac3d146715c76
27
- eu-central-1: ami-0402323ff6cf59dc3
28
- eu-north-1: ami-0c8c61870da56e00c
29
- eu-west-1: ami-02b5e95243d740d41
30
- eu-west-2: ami-0d3086afa04c0bac9
31
- eu-west-3: ami-07810e092578b4d32
32
- sa-east-1: ami-05f5c9f4fd81c0ae8
33
- us-east-2: ami-039668d561db19b15
34
- us-west-1: ami-09403e40a997f60bf
35
- us-west-2: ami-0728d0eef40a5430b
36
- centos7: &centos7
19
+ centos6: &3
20
+ us-east-1: ami-06a4e11df81ad5f36
21
+ ap-northeast-1: ami-0c777a90d1239a89f
22
+ ap-northeast-2: ami-00a536043e60d99e0
23
+ ap-south-1: ami-0dbe9e035d242ab19
24
+ ap-southeast-1: ami-07a0370b2aaca3d83
25
+ ap-southeast-2: ami-0df17df004fb2d85a
26
+ ca-central-1: ami-0852062afaf78369b
27
+ eu-central-1: ami-058aab5f423dea3fa
28
+ eu-north-1: ami-040fd7c04441f6c6b
29
+ eu-west-1: ami-0a0595aeafc8430b2
30
+ eu-west-2: ami-0f45a65b48147cbd2
31
+ eu-west-3: ami-0fa2dea3f867cd713
32
+ sa-east-1: ami-0e49de35e61a9bf6a
33
+ us-east-2: ami-06c0d5b6dbb7494c7
34
+ us-west-1: ami-08c8ff991d27c3a25
35
+ us-west-2: ami-0b62b81cae1d662c9
36
+ centos7:
37
37
  us-east-1: ami-0d98f625837fb042e
38
38
  ap-northeast-1: ami-0f86cf4470a454938
39
39
  ap-northeast-2: ami-012efba9ff5419589
@@ -50,29 +50,29 @@ centos7: &centos7
50
50
  us-east-2: ami-00c5f50b43ecdb248
51
51
  us-west-1: ami-0cc4055a6417e4df6
52
52
  us-west-2: ami-0c250c14d31f0847f
53
- ubuntu16: &ubuntu16
53
+ ubuntu16: &2
54
54
  us-east-1: ami-bcdc16c6
55
55
  us-west-1: ami-1b17257b
56
56
  us-west-2: ami-19e92861
57
- eu-west-1: ami-eed00d97
57
+ eu-west-1: ami-eed00d97
58
58
  eu-central-1: ami-e613ac89
59
59
  sa-east-1: ami-1ca7d970
60
60
  ap-northeast-1: ami-6959870f
61
61
  ap-northeast-2: ami-08d77266
62
- ap-southeast-1: ami-d9dca7ba
62
+ ap-southeast-1: ami-d9dca7ba
63
63
  ap-southeast-2: ami-02ad4060
64
- ubuntu14: &ubuntu14
64
+ ubuntu14:
65
65
  us-east-1: ami-663a6e0c
66
66
  us-west-1: ami-13988772
67
67
  us-west-2: ami-b885eed8
68
- eu-west-1: ami-b265c7c1
68
+ eu-west-1: ami-b265c7c1
69
69
  eu-central-1: ami-ad8894c1
70
70
  sa-east-1: ami-4196112d
71
71
  ap-northeast-1: ami-575b6e39
72
72
  ap-northeast-2: ami-f0ac629e
73
- ap-southeast-1: ami-2855964b
73
+ ap-southeast-1: ami-2855964b
74
74
  ap-southeast-2: ami-d19fc4b2
75
- win2k12r2: &win2k12r2
75
+ win2k12r2: &1
76
76
  us-east-1: ami-d4409aae
77
77
  us-east-2: ami-fbbe929e
78
78
  us-west-1: ami-ec91ac8c
@@ -85,14 +85,13 @@ win2k12r2: &win2k12r2
85
85
  ap-southeast-1: ami-b61657d5
86
86
  ap-southeast-2: ami-9a7b97f8
87
87
  ap-south-1: ami-99a8eaf6
88
- ca-central-1: ami-608b3304
89
- win2k16: &win2k16
88
+ ca-central-1: ami-608b3304
89
+ win2k16:
90
90
  us-east-1: ami-d2cb25a8
91
91
  us-east-2: ami-2db59748
92
92
  us-west-1: ami-2db59748
93
93
  us-west-2: ami-3b47ba43
94
94
  eu-central-1: ami-37d46558
95
- eu-west-1: ami-53408c2a
96
95
  eu-west-1: ami-06c5d662
97
96
  sa-east-1: ami-53fd803f
98
97
  ap-northeast-1: ami-ce8b42a8
@@ -101,11 +100,12 @@ win2k16: &win2k16
101
100
  ap-southeast-2: ami-792bcd1b
102
101
  ap-south-1: ami-448dcb2b
103
102
  ca-central-1: ami-a39920c7
104
- amazon: &amazon2016
103
+ amazon:
105
104
  us-east-1: ami-b73b63a0
106
105
  us-east-2: ami-58277d3d
107
106
  us-west-1: ami-23e8a343
108
107
  us-west-2: ami-5ec1673e
108
+ us-gov-east-1: ami-fdaf4e8c
109
109
  eu-central-1: ami-f9619996
110
110
  eu-west-1: ami-9398d3e0
111
111
  sa-east-1: ami-97831ffb
@@ -113,12 +113,10 @@ amazon: &amazon2016
113
113
  ap-northeast-2: ami-983ce8f6
114
114
  ap-southeast-1: ami-b953f2da
115
115
  ap-southeast-2: ami-db704cb8
116
- win2k12: *win2k12r2
117
- win2k16: *win2k16
118
- windows: *win2k12r2
119
- ubuntu: *ubuntu16
120
- centos: *centos6
121
- rhel7: *rhel71
122
- rhel: *rhel71
123
- linux: *centos6
124
- amazon: *amazon2016
116
+ win2k12: *1
117
+ windows: *1
118
+ ubuntu: *2
119
+ centos: *3
120
+ rhel7: *4
121
+ rhel: *4
122
+ linux: *3
@@ -0,0 +1,17 @@
1
+ ---
2
+ centos6: &centos6 OpenLogic/CentOS/6
3
+ #centos7: &centos7 westernoceansoftwaresprivatelimited/centos-7-6/centos-7-6-server
4
+ centos7: &centos7 OpenLogic/CentOS/7
5
+ rhel8: &rhel8 RedHat/RHEL/8
6
+ rhel7: &rhel7 RedHat/RHEL/7
7
+ rhel6: &rhel6 RedHat/RHEL/6
8
+ debian10: &debian10 Debian/debian-10/10
9
+ win2k12r2: &win2k12r2 MicrosoftWindowsServer/WindowsServer/2012-R2-Datacenter
10
+ win2k16: &win2k16 MicrosoftWindowsServer/WindowsServer/2016-Datacenter
11
+ win2k19: &win2k19 MicrosoftWindowsServer/WindowsServer/2019-Datacenter
12
+ win2k12: *win2k12r2
13
+ windows: *win2k16
14
+ centos: *centos7
15
+ rhel: *rhel7
16
+ linux: *centos7
17
+ debian: *debian10
@@ -0,0 +1,24 @@
1
+ ---
2
+ centos6: &centos6 centos-cloud/centos-6
3
+ centos7: &centos7 centos-cloud/centos-7
4
+ rhel71: &rhel71 rhel-cloud/rhel-7
5
+ rhel6: &rhel6 rhel-cloud/rhel-6
6
+ debian10: &debian10 debian-cloud/debian-10
7
+ debian9: &debian9 debian-cloud/debian-9
8
+ ubuntu14: &ubuntu14 ubuntu-os-cloud/ubuntu-1404-lts
9
+ ubuntu16: &ubuntu16 ubuntu-os-cloud/ubuntu-1604-lts
10
+ ubuntu18: &ubuntu18 ubuntu-os-cloud/ubuntu-1804-lts
11
+ ubuntu19: &ubuntu19 ubuntu-os-cloud/ubuntu-1904
12
+ win2k12r2: &win2k12r2 windows-cloud/windows-2012-r2
13
+ win2k16: &win2k16 windows-cloud/windows-2016
14
+ win2k19: &win2k19 windows-cloud/windows-2019
15
+ google: &google coreos-cloud/coreos-stable
16
+ coreos: *google
17
+ win2k12: *win2k12r2
18
+ windows: *win2k16
19
+ ubuntu: *ubuntu18
20
+ centos: *centos7
21
+ rhel7: *rhel71
22
+ rhel: *rhel71
23
+ linux: *centos7
24
+ debian: *debian10
@@ -1,2 +1,2 @@
1
1
  Do not edit these files in place! Instead, copy them to $install_prefix/etc
2
- (e.g. /opt/mu/etc/amazon_images.yaml) and make customizations there.
2
+ (e.g. /opt/mu/etc/AWS.yaml) and make customizations there.
@@ -50,6 +50,9 @@ module MU
50
50
  # We just pass this flag to MommaCat, telling it not to save any metadata.
51
51
  attr_reader :no_artifacts
52
52
 
53
+ # The deployment object we create for our stack
54
+ attr_reader :mommacat
55
+
53
56
  # Indicates whether we are updating an existing deployment, as opposed to
54
57
  # creating a new one.
55
58
  attr_reader :updating
@@ -66,6 +69,7 @@ module MU
66
69
  # @param deploy_id [String]: Reload and re-process an existing deploy
67
70
  def initialize(environment,
68
71
  verbosity: MU::Logger::NORMAL,
72
+ color: true,
69
73
  webify_logs: false,
70
74
  nocleanup: false,
71
75
  cloudformation_path: nil,
@@ -76,12 +80,14 @@ module MU
76
80
  deploy_id: nil,
77
81
  deploy_obj: nil)
78
82
  MU.setVar("verbosity", verbosity)
83
+ MU.setVar("color", color)
79
84
  @webify_logs = webify_logs
80
85
  @verbosity = verbosity
86
+ @color = color
81
87
  @nocleanup = nocleanup
82
88
  @no_artifacts = no_artifacts
83
89
  @reraise_thread = reraise_thread
84
- MU.setLogging(verbosity, webify_logs)
90
+ MU.setLogging(verbosity, webify_logs, STDOUT, color)
85
91
 
86
92
  MU::Cloud::CloudFormation.emitCloudFormation(set: force_cloudformation)
87
93
  @cloudformation_output = cloudformation_path
@@ -96,7 +102,7 @@ module MU
96
102
  @dependency_semaphore = Mutex.new
97
103
 
98
104
  @main_config = stack_conf
99
- @original_config = Marshal.load(Marshal.dump(stack_conf))
105
+ @original_config = Marshal.load(Marshal.dump(MU.structToHash(stack_conf.dup)))
100
106
  @original_config.freeze
101
107
  @admins = stack_conf["admins"]
102
108
  @mommacat = deploy_obj
@@ -109,7 +115,7 @@ module MU
109
115
  @updating = false
110
116
  time=Time.new
111
117
  @appname = stack_conf["appname"]
112
- @timestamp = time.strftime("%Y%m%d%H").to_s;
118
+ @timestamp = time.strftime("%Y%m%d%H").to_s
113
119
  @timestamp.freeze
114
120
  @timestart = time.to_s;
115
121
  @timestart.freeze
@@ -141,7 +147,7 @@ module MU
141
147
  if !@main_config[data[:cfg_plural]].nil? and @main_config[data[:cfg_plural]].size > 0
142
148
  @main_config[data[:cfg_plural]].each { |resource|
143
149
  if force_cloudformation
144
- if resource['cloud'] = "AWS"
150
+ if resource['cloud'] == "AWS"
145
151
  resource['cloud'] = "CloudFormation"
146
152
  if resource.has_key?("vpc") and resource["vpc"].is_a?(Hash)
147
153
  resource["vpc"]['cloud'] = "CloudFormation"
@@ -205,12 +211,26 @@ module MU
205
211
  if !die
206
212
  puts "Received SIGINT, hit ctrl-C again within five seconds to kill this deployment."
207
213
  else
208
- raise "Terminated by user"
214
+ Thread.list.each do |t|
215
+ next if !t.status
216
+ if t.object_id != Thread.current.object_id and
217
+ t.thread_variable_get("name") != "main_thread" and
218
+ t.thread_variable_get("owned_by_mu")
219
+ t.kill
220
+ end
221
+ end
222
+
223
+ if @main_thread
224
+ @main_thread.raise "Terminated by user"
225
+ else
226
+ raise "Terminated by user"
227
+ end
209
228
  end
210
229
  @last_sigterm = Time.now.to_i
211
230
  end
212
231
 
213
232
  begin
233
+ @main_thread = Thread.current
214
234
  if !@mommacat
215
235
  metadata = {
216
236
  "appname" => @appname,
@@ -238,16 +258,25 @@ module MU
238
258
  @admins.each { |admin|
239
259
  @mommacat.notify("admins", admin['name'], admin)
240
260
  }
261
+ if @mommacat.numKittens(types: ["Server", "ServerPool"]) > 0
262
+ MU::MommaCat.start
263
+ end
241
264
 
242
265
  @deploy_semaphore = Mutex.new
243
266
  parent_thread_id = Thread.current.object_id
244
- @main_thread = Thread.current
267
+
268
+ # Run cloud provider-specific deploy meta-artifact creation (ssh keys,
269
+ # resource groups, etc)
270
+ @mommacat.cloudsUsed.each { |cloud|
271
+ cloudclass = Object.const_get("MU").const_get("Cloud").const_get(cloud)
272
+ cloudclass.initDeploy(@mommacat)
273
+ }
245
274
 
246
275
  # Kick off threads to create each of our new servers.
247
276
  @my_threads << Thread.new {
248
277
  MU.dupGlobals(parent_thread_id)
249
278
  Thread.current.thread_variable_set("name", "mu_create_container")
250
- Thread.abort_on_exception = true
279
+ # Thread.abort_on_exception = false
251
280
  MU::Cloud.resource_types.each { |cloudclass, data|
252
281
  if !@main_config[data[:cfg_plural]].nil? and
253
282
  @main_config[data[:cfg_plural]].size > 0 and
@@ -261,7 +290,7 @@ module MU
261
290
  @my_threads << Thread.new {
262
291
  MU.dupGlobals(parent_thread_id)
263
292
  Thread.current.thread_variable_set("name", "mu_groom_container")
264
- Thread.abort_on_exception = true
293
+ # Thread.abort_on_exception = false
265
294
  MU::Cloud.resource_types.each { |cloudclass, data|
266
295
  if !@main_config[data[:cfg_plural]].nil? and
267
296
  @main_config[data[:cfg_plural]].size > 0 and
@@ -283,9 +312,13 @@ module MU
283
312
  t.join
284
313
  end
285
314
 
315
+ @mommacat.save!
316
+
286
317
  rescue Exception => e
287
318
  @my_threads.each do |t|
288
- if t.object_id != Thread.current.object_id and t.thread_variable_get("name") != "main_thread" and t.object_id != parent_thread_id
319
+ if t.object_id != Thread.current.object_id and
320
+ t.thread_variable_get("name") != "main_thread" and
321
+ t.object_id != parent_thread_id
289
322
  MU::MommaCat.unlockAll
290
323
  t.kill
291
324
  end
@@ -294,14 +327,17 @@ module MU
294
327
  # If it was a regular old exit, we assume something deeper in already
295
328
  # handled logging and cleanup for us, and just quietly go away.
296
329
  if e.class.to_s != "SystemExit"
297
- MU.log e.inspect, MU::ERR, details: e.backtrace if @verbosity != MU::Logger::SILENT
330
+ MU.log e.class.name+": "+e.message, MU::ERR, details: e.backtrace if @verbosity != MU::Logger::SILENT
298
331
  if !@nocleanup
299
- Thread.list.each do |t|
300
- if t.object_id != Thread.current.object_id and t.thread_variable_get("name") != "main_thread" and t.object_id != parent_thread_id
301
- t.kill
302
- end
303
- end
304
- MU::Cleanup.run(MU.deploy_id, skipsnapshots: true, verbosity: @verbosity, mommacat: @mommacat)
332
+
333
+ # Wrap this in a thread to protect the Azure SDK from imploding
334
+ # because it mistakenly thinks there's a deadlock.
335
+ cleanup_thread = Thread.new {
336
+ MU.dupGlobals(parent_thread_id)
337
+ Thread.abort_on_exception = false
338
+ MU::Cleanup.run(MU.deploy_id, skipsnapshots: true, verbosity: @verbosity, mommacat: @mommacat)
339
+ }
340
+ cleanup_thread.join
305
341
  @nocleanup = true # so we don't run this again later
306
342
  end
307
343
  end
@@ -333,7 +369,7 @@ module MU
333
369
  if MU.myCloud == "AWS"
334
370
  MU::Cloud::AWS.openFirewallForClients # XXX add the other clouds, or abstract
335
371
  end
336
- MU::MommaCat.getLitter(MU.deploy_id, use_cache: false)
372
+ # MU::MommaCat.getLitter(MU.deploy_id, use_cache: false)
337
373
  if @mommacat.numKittens(types: ["Server", "ServerPool"]) > 0
338
374
  # MU::MommaCat.syncMonitoringConfig # TODO only invoke if Server or ServerPool actually changed something when @updating
339
375
  end
@@ -401,19 +437,7 @@ module MU
401
437
  }
402
438
  end
403
439
 
404
- if $MU_CFG['slack'] and $MU_CFG['slack']['webhook'] and
405
- (!$MU_CFG['slack']['skip_environments'] or !$MU_CFG['slack']['skip_environments'].any?{ |s| s.casecmp(MU.environment)==0 })
406
- require 'slack-notifier'
407
- slack = Slack::Notifier.new $MU_CFG['slack']['webhook']
408
-
409
- slack.ping "Mu deployment #{MU.appname} *\"#{MU.handle}\"* (`#{MU.deploy_id}`) successfully completed on *#{$MU_CFG['hostname']}* (#{$MU_CFG['public_address']})", channel: $MU_CFG['slack']['channel']
410
- if MU.summary.size > 0
411
- MU.summary.each { |msg|
412
- slack.ping msg, channel: $MU_CFG['slack']['channel']
413
- }
414
- end
415
- end
416
-
440
+ @mommacat.sendAdminSlack("Deploy completed succesfully", msg: MU.summary.join("\n"))
417
441
  end
418
442
 
419
443
  private
@@ -431,6 +455,7 @@ module MU
431
455
  $str += JSON.pretty_generate(@mommacat.deployment)
432
456
 
433
457
  admin_addrs = @admins.map { |admin|
458
+ admin['name'] ||= ""
434
459
  admin['name']+" <"+admin['email']+">"
435
460
  }
436
461
 
@@ -516,7 +541,7 @@ MESSAGE_END
516
541
 
517
542
  services.each { |resource|
518
543
  if !resource["#MU_CLOUDCLASS"]
519
- pp resource
544
+ # pp resource
520
545
  end
521
546
  res_type = resource["#MU_CLOUDCLASS"].cfg_name
522
547
  name = res_type+"_"+resource["name"]
@@ -531,9 +556,10 @@ MESSAGE_END
531
556
  if resource["dependencies"] != nil then
532
557
  resource["dependencies"].each { |dependency|
533
558
  parent_class = nil
534
- MU::Cloud.resource_types.each_pair { |name, attrs|
535
- if attrs[:cfg_name] == dependency['type']
536
- parent_class = Object.const_get("MU").const_get("Cloud").const_get(name)
559
+ MU::Cloud.resource_types.each_pair { |res_class, attrs|
560
+ if attrs[:cfg_name] == dependency['type'] or
561
+ attrs[:cfg_plural] == dependency['type']
562
+ parent_class = Object.const_get("MU").const_get("Cloud").const_get(res_class)
537
563
  break
538
564
  end
539
565
  }
@@ -576,109 +602,126 @@ MESSAGE_END
576
602
  parent_thread = Thread.current
577
603
  services.uniq!
578
604
  services.each do |service|
579
- @my_threads << Thread.new(service) { |myservice|
580
- MU.dupGlobals(parent_thread_id)
581
- threadname = service["#MU_CLOUDCLASS"].cfg_name+"_"+myservice["name"]+"_#{mode}"
582
- Thread.current.thread_variable_set("name", threadname)
583
- Thread.abort_on_exception = true
584
- waitOnThreadDependencies(threadname)
585
-
586
- if service["#MU_CLOUDCLASS"].instance_methods(false).include?(:groom) and !service['dependencies'].nil? and !service['dependencies'].size == 0
587
- if mode == "create"
588
- MU::MommaCat.lock(service["#MU_CLOUDCLASS"].cfg_name+"_"+myservice["name"]+"-dependencies")
589
- elsif mode == "groom"
590
- MU::MommaCat.unlock(service["#MU_CLOUDCLASS"].cfg_name+"_"+myservice["name"]+"-dependencies")
605
+ begin
606
+ @my_threads << Thread.new(service) { |myservice|
607
+ MU.dupGlobals(parent_thread_id)
608
+ threadname = myservice["#MU_CLOUDCLASS"].cfg_name+"_"+myservice["name"]+"_#{mode}"
609
+ Thread.current.thread_variable_set("name", threadname)
610
+ Thread.current.thread_variable_set("owned_by_mu", true)
611
+ # Thread.abort_on_exception = false
612
+ waitOnThreadDependencies(threadname)
613
+
614
+ if myservice["#MU_CLOUDCLASS"].instance_methods(false).include?(:groom) and !myservice['dependencies'].nil? and !myservice['dependencies'].size == 0
615
+ if mode == "create"
616
+ MU::MommaCat.lock(myservice["#MU_CLOUDCLASS"].cfg_name+"_"+myservice["name"]+"-dependencies")
617
+ elsif mode == "groom"
618
+ MU::MommaCat.unlock(myservice["#MU_CLOUDCLASS"].cfg_name+"_"+myservice["name"]+"-dependencies")
619
+ end
591
620
  end
592
- end
593
621
 
594
- MU.log "Launching thread #{threadname}", MU::DEBUG
595
- begin
596
- if service['#MUOBJECT'].nil?
597
- service['#MUOBJECT'] = service["#MU_CLOUDCLASS"].new(mommacat: @mommacat, kitten_cfg: myservice, delayed_save: @updating)
598
- end
599
- rescue Exception => e
600
- MU::MommaCat.unlockAll
601
- @main_thread.raise MuError, "Error instantiating object from #{service["#MU_CLOUDCLASS"]} (#{e.inspect})", e.backtrace
602
- raise e
603
- end
604
- begin
605
- run_this_method = service['#MUOBJECT'].method(mode)
606
- rescue Exception => e
607
- MU::MommaCat.unlockAll
608
- @main_thread.raise MuError, "Error invoking #{service["#MU_CLOUDCLASS"]}.#{mode} for #{myservice['name']} (#{e.inspect})", e.backtrace
609
- raise e
610
- end
611
- begin
612
- MU.log "Checking whether to run #{service['#MUOBJECT']}.#{mode} (updating: #{@updating})", MU::DEBUG
613
- if !@updating or mode != "create"
614
- myservice = run_this_method.call
615
- else
616
-
617
- # XXX experimental create behavior for --liveupdate flag, only works on a couple of resource types. Inserting new resources into an old deploy is tricky.
618
- opts = {}
619
- if service["#MU_CLOUDCLASS"].cfg_name == "loadbalancer"
620
- opts['classic'] = service['classic'] ? true : false
622
+ MU.log "Launching thread #{threadname}", MU::DEBUG
623
+ begin
624
+ if myservice['#MUOBJECT'].nil?
625
+ if @mommacat
626
+ ext_obj = @mommacat.findLitterMate(type: myservice["#MU_CLOUDCLASS"].cfg_plural, name: myservice['name'], credentials: myservice['credentials'], created_only: true, return_all: false)
627
+ if @updating
628
+ raise MuError, "Failed to findLitterMate(type: #{myservice["#MU_CLOUDCLASS"].cfg_plural}, name: #{myservice['name']}, credentials: #{myservice['credentials']}, created_only: true, return_all: false) in deploy #{@mommacat.deploy_id}" if !ext_obj
629
+ ext_obj.config!(myservice)
630
+ end
631
+ myservice['#MUOBJECT'] = ext_obj
632
+ end
633
+ myservice['#MUOBJECT'] ||= myservice["#MU_CLOUDCLASS"].new(mommacat: @mommacat, kitten_cfg: myservice, delayed_save: @updating)
621
634
  end
635
+ rescue Exception => e
636
+ MU::MommaCat.unlockAll
637
+ @main_thread.raise MuError, "Error instantiating object from #{myservice["#MU_CLOUDCLASS"]} (#{e.inspect})", e.backtrace
638
+ raise e
639
+ end
640
+ begin
641
+ run_this_method = myservice['#MUOBJECT'].method(mode)
642
+ rescue Exception => e
643
+ MU::MommaCat.unlockAll
644
+ @main_thread.raise MuError, "Error invoking #{myservice["#MU_CLOUDCLASS"]}.#{mode} for #{myservice['name']} (#{e.inspect})", e.backtrace
645
+ raise e
646
+ end
647
+ begin
648
+ MU.log "Checking whether to run #{myservice['#MUOBJECT']}.#{mode} (updating: #{@updating})", MU::DEBUG
649
+ if !@updating or mode != "create"
650
+ myservice = run_this_method.call
651
+ else
622
652
 
623
- found = MU::MommaCat.findStray(service['cloud'],
624
- service["#MU_CLOUDCLASS"].cfg_name,
625
- name: service['name'],
626
- region: service['region'],
627
- deploy_id: @mommacat.deploy_id,
628
- # allow_multi: service["#MU_CLOUDCLASS"].has_multiple,
629
- tag_key: "MU-ID",
630
- tag_value: @mommacat.deploy_id,
631
- flags: opts,
632
- dummy_ok: false
633
- )
634
-
635
- found = found.delete_if { |x|
636
- x.cloud_id.nil? and x.cloudobj.cloud_id.nil?
637
- }
653
+ # XXX experimental create behavior for --liveupdate flag, only works on a couple of resource types. Inserting new resources into an old deploy is tricky.
654
+ opts = {}
655
+ if myservice["#MU_CLOUDCLASS"].cfg_name == "loadbalancer"
656
+ opts['classic'] = myservice['classic'] ? true : false
657
+ end
638
658
 
639
- if found.size == 0
640
- if service["#MU_CLOUDCLASS"].cfg_name == "loadbalancer" or
641
- service["#MU_CLOUDCLASS"].cfg_name == "firewall_rule" or
642
- service["#MU_CLOUDCLASS"].cfg_name == "msg_queue" or
643
- service["#MU_CLOUDCLASS"].cfg_name == "server_pool" or
644
- service["#MU_CLOUDCLASS"].cfg_name == "container_cluster"
645
- # XXX only know LBs to be safe, atm
646
- MU.log "#{service["#MU_CLOUDCLASS"].name} #{service['name']} not found, creating", MU::NOTICE
659
+ found = MU::MommaCat.findStray(myservice['cloud'],
660
+ myservice["#MU_CLOUDCLASS"].cfg_name,
661
+ name: myservice['name'],
662
+ credentials: myservice['credentials'],
663
+ region: myservice['region'],
664
+ deploy_id: @mommacat.deploy_id,
665
+ # allow_multi: myservice["#MU_CLOUDCLASS"].has_multiple,
666
+ tag_key: "MU-ID",
667
+ tag_value: @mommacat.deploy_id,
668
+ flags: opts,
669
+ dummy_ok: false
670
+ )
671
+
672
+ found = found.delete_if { |x|
673
+ x.cloud_id.nil? and x.cloudobj.cloud_id.nil?
674
+ }
675
+
676
+ if found.size == 0
677
+ MU.log "#{myservice["#MU_CLOUDCLASS"].name} #{myservice['name']} not found, creating", MU::NOTICE
647
678
  myservice = run_this_method.call
679
+ else
680
+ real_descriptor = @mommacat.findLitterMate(type: myservice["#MU_CLOUDCLASS"].cfg_name, name: myservice['name'], created_only: true)
681
+
682
+ if !real_descriptor
683
+ MU.log "Invoking #{run_this_method.to_s} #{myservice['name']} #{myservice['name']}", MU::NOTICE
684
+ myservice = run_this_method.call
685
+ end
686
+ #MU.log "#{myservice["#MU_CLOUDCLASS"].cfg_name} #{myservice['name']}", MU::NOTICE
648
687
  end
649
- else
650
- real_descriptor = @mommacat.findLitterMate(type: service["#MU_CLOUDCLASS"].cfg_name, name: service['name'], created_only: true)
651
-
652
- if !real_descriptor and (
653
- service["#MU_CLOUDCLASS"].cfg_name == "loadbalancer" or
654
- service["#MU_CLOUDCLASS"].cfg_name == "firewall_rule" or
655
- service["#MU_CLOUDCLASS"].cfg_name == "msg_queue" or
656
- service["#MU_CLOUDCLASS"].cfg_name == "server_pool" or
657
- service["#MU_CLOUDCLASS"].cfg_name == "container_cluster"
658
- )
659
- MU.log "Invoking #{run_this_method.to_s} #{service['name']} #{service['name']}", MU::NOTICE
660
- myservice = run_this_method.call
688
+
689
+ end
690
+ rescue ThreadError => e
691
+ MU.log "Waiting for threads to complete (#{e.message})", MU::NOTICE
692
+ @my_threads.each do |thr|
693
+ next if thr.object_id == Thread.current.object_id
694
+ thr.join(0.1)
695
+ end
696
+ @my_threads.reject! { |thr| !thr.alive? }
697
+ sleep 10+Random.rand(20)
698
+ retry
699
+ rescue Exception => e
700
+ MU.log e.inspect, MU::ERR, details: e.backtrace if @verbosity != MU::Logger::SILENT
701
+ MU::MommaCat.unlockAll
702
+ Thread.list.each do |t|
703
+ if t.object_id != Thread.current.object_id and t.thread_variable_get("name") != "main_thread" and t.object_id != parent_thread_id and t.thread_variable_get("owned_by_mu")
704
+ t.kill
661
705
  end
662
- #MU.log "#{service["#MU_CLOUDCLASS"].cfg_name} #{service['name']}", MU::NOTICE
663
706
  end
664
-
665
- end
666
- rescue Exception => e
667
- MU.log e.inspect, MU::ERR, details: e.backtrace if @verbosity != MU::Logger::SILENT
668
- MU::MommaCat.unlockAll
669
- Thread.list.each do |t|
670
- if t.object_id != Thread.current.object_id and t.thread_variable_get("name") != "main_thread" and t.object_id != parent_thread_id
671
- t.kill
707
+ if !@nocleanup
708
+ MU::Cleanup.run(MU.deploy_id, verbosity: @verbosity, skipsnapshots: true)
709
+ @nocleanup = true # so we don't run this again later
672
710
  end
711
+ @main_thread.raise MuError, e.message, e.backtrace
673
712
  end
674
- if !@nocleanup
675
- MU::Cleanup.run(MU.deploy_id, verbosity: @verbosity, skipsnapshots: true)
676
- @nocleanup = true # so we don't run this again later
677
- end
678
- @main_thread.raise MuError, e.message, e.backtrace
713
+ MU.purgeGlobals
714
+ }
715
+ rescue ThreadError => e
716
+ MU.log "Waiting for threads to complete (#{e.message})", MU::NOTICE
717
+ @my_threads.each do |thr|
718
+ next if thr.object_id == Thread.current.object_id
719
+ thr.join(0.1)
679
720
  end
680
- MU.purgeGlobals
681
- }
721
+ @my_threads.reject! { |thr| !thr.alive? }
722
+ sleep 10+Random.rand(20)
723
+ retry
724
+ end
682
725
  end
683
726
  end
684
727