cloud-mu 2.1.0beta → 3.0.0beta

Sign up to get free protection for your applications and to get access to all the features.
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