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
@@ -41,7 +41,7 @@ module MU
41
41
  # @param web [Boolean]: Generate web-friendly output.
42
42
  # @param ignoremaster [Boolean]: Ignore the tags indicating the originating MU master server when deleting.
43
43
  # @return [void]
44
- def self.run(deploy_id, noop: false, skipsnapshots: false, onlycloud: false, verbosity: MU::Logger::NORMAL, web: false, ignoremaster: false, skipcloud: false, mommacat: nil)
44
+ def self.run(deploy_id, noop: false, skipsnapshots: false, onlycloud: false, verbosity: MU::Logger::NORMAL, web: false, ignoremaster: false, skipcloud: false, mommacat: nil, credsets: nil, regions: nil)
45
45
  MU.setLogging(verbosity, web)
46
46
  @noop = noop
47
47
  @skipsnapshots = skipsnapshots
@@ -61,7 +61,7 @@ module MU
61
61
  end
62
62
 
63
63
 
64
- types_in_order = ["Collection", "Endpoint", "Function", "ServerPool", "ContainerCluster", "SearchDomain", "Server", "MsgQueue", "Database", "CacheCluster", "StoragePool", "LoadBalancer", "NoSQLDB", "FirewallRule", "Alarm", "Notifier", "Log", "VPC", "Role", "Group", "User", "Bucket", "DNSZone", "Collection", "Habitat", "Folder"]
64
+ types_in_order = ["Collection", "Endpoint", "Function", "ServerPool", "ContainerCluster", "SearchDomain", "Server", "MsgQueue", "Database", "CacheCluster", "StoragePool", "LoadBalancer", "NoSQLDB", "FirewallRule", "Alarm", "Notifier", "Log", "VPC", "Role", "Group", "User", "Bucket", "DNSZone", "Collection"]
65
65
 
66
66
  # Load up our deployment metadata
67
67
  if !mommacat.nil?
@@ -75,190 +75,229 @@ module MU
75
75
  FileUtils.touch("#{deploy_dir}/.cleanup") if !@noop
76
76
  else
77
77
  MU.log "I don't see a deploy named #{deploy_id}.", MU::WARN
78
- MU.log "Known deployments:\n#{Dir.entries(deploy_dir).reject { |item| item.match(/^\./) or !File.exists?(deploy_dir+"/"+item+"/public_key") }.join("\n")}", MU::WARN
78
+ MU.log "Known deployments:\n#{Dir.entries(deploy_dir).reject { |item| item.match(/^\./) or !File.exist?(deploy_dir+"/"+item+"/public_key") }.join("\n")}", MU::WARN
79
79
  MU.log "Searching for remnants of #{deploy_id}, though this may be an invalid MU-ID.", MU::WARN
80
80
  end
81
- @mommacat = MU::MommaCat.new(deploy_id, mu_user: MU.mu_user)
81
+ @mommacat = MU::MommaCat.new(deploy_id, mu_user: MU.mu_user, delay_descriptor_load: true)
82
82
  rescue Exception => e
83
83
  MU.log "Can't load a deploy record for #{deploy_id} (#{e.inspect}), cleaning up resources by guesswork", MU::WARN, details: e.backtrace
84
84
  MU.setVar("deploy_id", deploy_id)
85
+
85
86
  end
86
87
  end
87
88
 
89
+ regionsused = @mommacat.regionsUsed if @mommacat
90
+ credsused = @mommacat.credsUsed if @mommacat
91
+
88
92
  if !@skipcloud
89
93
  creds = {}
90
- MU::Cloud.supportedClouds.each { |cloud|
94
+ MU::Cloud.availableClouds.each { |cloud|
91
95
  if $MU_CFG[cloud.downcase] and $MU_CFG[cloud.downcase].size > 0
92
96
  cloudclass = Object.const_get("MU").const_get("Cloud").const_get(cloud)
93
97
  creds[cloud] ||= {}
94
98
  cloudclass.listCredentials.each { |credset|
99
+ next if credsets and credsets.size > 0 and !credsets.include?(credset)
100
+ next if credsused and credsused.size > 0 and !credsused.include?(credset)
101
+ MU.log "Will scan #{cloud} with credentials #{credset}"
95
102
  creds[cloud][credset] = cloudclass.listRegions(credentials: credset)
96
103
  }
97
104
  end
98
105
  }
106
+
99
107
  parent_thread_id = Thread.current.object_id
100
108
  deleted_nodes = 0
101
- @regionthreads = []
109
+ cloudthreads = []
102
110
  keyname = "deploy-#{MU.deploy_id}"
103
- # XXX blindly checking for all of these resources in all clouds is now prohibitively slow. We should only do this when we don't see deployment metadata to work from.
104
- creds.each_pair { |provider, credsets|
105
- credsets.each_pair { |credset, regions|
106
- global_vs_region_semaphore = Mutex.new
107
- global_done = []
108
- regions.each { |r|
109
- @regionthreads << Thread.new {
110
- MU.dupGlobals(parent_thread_id)
111
- MU.setVar("curRegion", r)
112
- projects = []
113
- if $MU_CFG[provider.downcase][credset]["project"]
114
- # XXX GCP credential schema needs an array for projects
115
- projects << $MU_CFG[provider.downcase][credset]["project"]
116
- end
117
111
 
118
- if projects == []
119
- projects << "" # dummy
120
- MU.log "Checking for #{provider}/#{credset} resources from #{MU.deploy_id} in #{r}", MU::NOTICE
112
+ creds.each_pair { |provider, credsets_outer|
113
+ cloudthreads << Thread.new(provider, credsets_outer) { |cloud, credsets_inner|
114
+ MU.dupGlobals(parent_thread_id)
115
+ Thread.abort_on_exception = false
116
+ cloudclass = Object.const_get("MU").const_get("Cloud").const_get(cloud)
117
+ habitatclass = Object.const_get("MU").const_get("Cloud").const_get(cloud).const_get("Habitat")
118
+ credsets_inner.each_pair { |credset, acct_regions|
119
+ next if credsused and !credsused.include?(credset)
120
+ global_vs_region_semaphore = Mutex.new
121
+ global_done = {}
122
+ habitats_done = {}
123
+ regionthreads = []
124
+ acct_regions.each { |r|
125
+ if regionsused
126
+ if regionsused.size > 0
127
+ next if !regionsused.include?(r)
128
+ else
129
+ next if r != cloudclass.myRegion(credset)
130
+ end
121
131
  end
122
-
123
- # We do these in an order that unrolls dependent resources
124
- # sensibly, and we hit :Collection twice because AWS
125
- # CloudFormation sometimes fails internally.
126
- projectthreads = []
127
- projects.each { |project|
128
- projectthreads << Thread.new {
129
- MU.dupGlobals(parent_thread_id)
130
- MU.setVar("curRegion", r)
131
- if project != ""
132
- MU.log "Checking for #{provider}/#{credset} resources from #{MU.deploy_id} in #{r}, project #{project}", MU::NOTICE
133
- end
134
-
135
- MU.dupGlobals(parent_thread_id)
136
- flags = {
137
- "project" => project,
138
- "onlycloud" => @onlycloud,
139
- "skipsnapshots" => @skipsnapshots,
140
- }
141
- types_in_order.each { |t|
142
- begin
143
- skipme = false
144
- global_vs_region_semaphore.synchronize {
145
- if Object.const_get("MU").const_get("Cloud").const_get(provider).const_get(t).isGlobal?
146
- if !global_done.include?(t)
147
- global_done << t
148
- flags['global'] = true
149
- else
150
- skipme = true
151
- end
152
- end
153
- }
154
- next if skipme
155
- rescue MU::Cloud::MuCloudResourceNotImplemented => e
156
- next
157
- rescue MU::MuError, NoMethodError => e
158
- MU.log e.message, MU::WARN
159
- next
160
- rescue ::Aws::EC2::Errors::AuthFailure => e
161
- # AWS has been having transient auth problems with ap-east-1 lately
162
- MU.log e.message+" in "+r, MU::ERR
163
- next
132
+ if regions and !regions.empty?
133
+ next if !regions.include?(r)
134
+ MU.log "Checking for #{cloud}/#{credset} resources from #{MU.deploy_id} in #{r}...", MU::NOTICE
135
+ end
136
+ regionthreads << Thread.new {
137
+ MU.dupGlobals(parent_thread_id)
138
+ Thread.abort_on_exception = false
139
+ MU.setVar("curRegion", r)
140
+ projects = []
141
+ if $MU_CFG[cloud.downcase][credset]["project"]
142
+ # XXX GCP credential schema needs an array for projects
143
+ projects << $MU_CFG[cloud.downcase][credset]["project"]
144
+ end
145
+ begin
146
+ projects.concat(cloudclass.listProjects(credset))
147
+ rescue NoMethodError
148
+ end
149
+
150
+ if projects == []
151
+ projects << "" # dummy
152
+ MU.log "Checking for #{cloud}/#{credset} resources from #{MU.deploy_id} in #{r}", MU::NOTICE
153
+ end
154
+ projects.uniq!
155
+
156
+ # We do these in an order that unrolls dependent resources
157
+ # sensibly, and we hit :Collection twice because AWS
158
+ # CloudFormation sometimes fails internally.
159
+ projectthreads = []
160
+ projects.each { |project|
161
+ next if !habitatclass.isLive?(project, credset)
162
+
163
+ projectthreads << Thread.new {
164
+ MU.dupGlobals(parent_thread_id)
165
+ MU.setVar("curRegion", r)
166
+ Thread.abort_on_exception = false
167
+ if project != ""
168
+ MU.log "Checking for #{cloud}/#{credset} resources from #{MU.deploy_id} in #{r}, project #{project}", MU::NOTICE
164
169
  end
165
170
 
166
- if @mommacat.nil? or @mommacat.numKittens(types: [t]) > 0
167
- if @mommacat
168
- found = @mommacat.findLitterMate(type: t, return_all: true, credentials: credset)
169
- flags['known'] ||= []
170
- if found.is_a?(Array)
171
- found.each { |k|
172
- flags['known'] << k.cloud_id
173
- }
174
- elsif found and found.is_a?(Hash)
175
- flags['known'] << found['cloud_id']
176
- elsif found
177
- flags['known'] << found.cloud_id
178
- end
171
+ MU.dupGlobals(parent_thread_id)
172
+ flags = {
173
+ "project" => project,
174
+ "onlycloud" => @onlycloud,
175
+ "skipsnapshots" => @skipsnapshots,
176
+ }
177
+ types_in_order.each { |t|
178
+ shortclass, cfg_name, cfg_plural, classname = MU::Cloud.getResourceNames(t)
179
+ begin
180
+ skipme = false
181
+ global_vs_region_semaphore.synchronize {
182
+ MU::Cloud.loadCloudType(cloud, t)
183
+ if Object.const_get("MU").const_get("Cloud").const_get(cloud).const_get(t).isGlobal?
184
+ global_done[project] ||= []
185
+ if !global_done[project].include?(t)
186
+ global_done[project] << t
187
+ flags['global'] = true
188
+ else
189
+ skipme = true
190
+ end
191
+ end
192
+ }
193
+ next if skipme
194
+ rescue MU::Cloud::MuDefunctHabitat, MU::Cloud::MuCloudResourceNotImplemented => e
195
+ next
196
+ rescue MU::MuError, NoMethodError => e
197
+ MU.log "While checking mu/clouds/#{cloud.downcase}/#{cloudclass.cfg_name} for global-ness in cleanup: "+e.message, MU::WARN
198
+ next
199
+ rescue ::Aws::EC2::Errors::AuthFailure, ::Google::Apis::ClientError => e
200
+ MU.log e.message+" in "+r, MU::ERR
201
+ next
179
202
  end
203
+
180
204
  begin
181
- resclass = Object.const_get("MU").const_get("Cloud").const_get(t)
182
- resclass.cleanup(
183
- noop: @noop,
184
- ignoremaster: @ignoremaster,
185
- region: r,
186
- cloud: provider,
187
- flags: flags,
188
- credentials: credset
189
- )
190
- rescue Seahorse::Client::NetworkingError => e
191
- MU.log "Service not available in AWS region #{r}, skipping", MU::DEBUG, details: e.message
205
+ self.call_cleanup(t, credset, cloud, flags, r)
206
+ rescue MU::Cloud::MuDefunctHabitat, MU::Cloud::MuCloudResourceNotImplemented => e
207
+ next
192
208
  end
193
- end
209
+ }
210
+ } # types_in_order.each { |t|
211
+ } # projects.each { |project|
212
+ projectthreads.each do |t|
213
+ t.join
214
+ end
215
+
216
+ # XXX move to MU::AWS
217
+ if cloud == "AWS"
218
+ resp = MU::Cloud::AWS.ec2(region: r, credentials: credset).describe_key_pairs(
219
+ filters: [{name: "key-name", values: [keyname]}]
220
+ )
221
+ resp.data.key_pairs.each { |keypair|
222
+ MU.log "Deleting key pair #{keypair.key_name} from #{r}"
223
+ MU::Cloud::AWS.ec2(region: r, credentials: credset).delete_key_pair(key_name: keypair.key_name) if !@noop
194
224
  }
195
- }
196
- }
197
- projectthreads.each do |t|
198
- t.join
199
- end
225
+ end
226
+ } # regionthreads << Thread.new {
227
+ } # acct_regions.each { |r|
228
+ regionthreads.each do |t|
229
+ t.join
230
+ end
200
231
 
201
- # XXX move to MU::AWS
202
- if provider == "AWS"
203
- resp = MU::Cloud::AWS.ec2(region: r, credentials: credset).describe_key_pairs(
204
- filters: [{name: "key-name", values: [keyname]}]
205
- )
206
- resp.data.key_pairs.each { |keypair|
207
- MU.log "Deleting key pair #{keypair.key_name} from #{r}"
208
- MU::Cloud::AWS.ec2(region: r, credentials: credset).delete_key_pair(key_name: keypair.key_name) if !@noop
209
- }
210
- end
232
+ } # credsets.each_pair { |credset, acct_regions|
233
+ } # cloudthreads << Thread.new(provider, credsets) { |cloud, credsets_outer|
234
+ cloudthreads.each do |t|
235
+ t.join
236
+ end
237
+ } # creds.each_pair { |provider, credsets|
238
+
239
+
240
+ # Knock habitats and folders, which would contain the above resources,
241
+ # once they're all done.
242
+ creds.each_pair { |provider, credsets_inner|
243
+ credsets_inner.keys.each { |credset|
244
+ next if credsused and !credsused.include?(credset)
245
+ ["Habitat", "Folder"].each { |t|
246
+ flags = {
247
+ "onlycloud" => @onlycloud,
248
+ "skipsnapshots" => @skipsnapshots
211
249
  }
250
+ self.call_cleanup(t, credset, provider, flags, nil)
212
251
  }
213
252
  }
214
253
  }
215
254
 
216
- @regionthreads.each do |t|
217
- t.join
218
- end
219
- @projectthreads = []
220
-
221
-
222
- @projectthreads.each do |t|
223
- t.join
224
- end
225
-
226
255
  MU::Cloud::Google.removeDeploySecretsAndRoles(MU.deploy_id)
227
256
  # XXX port AWS equivalent behavior and add a MU::Cloud wrapper
257
+
258
+ creds.each_pair { |provider, credsets_inner|
259
+ cloudclass = Object.const_get("MU").const_get("Cloud").const_get(provider)
260
+ credsets_inner.keys.each { |c|
261
+ cloudclass.cleanDeploy(MU.deploy_id, credentials: c, noop: @noop)
262
+ }
263
+ }
228
264
  end
229
265
 
230
266
  # Scrub any residual Chef records with matching tags
231
- if !@onlycloud and (@mommacat.nil? or @mommacat.numKittens(types: ["Server", "ServerPool"]) > 0)
232
- MU::Groomer::Chef.loadChefLib
233
- if File.exists?(Etc.getpwuid(Process.uid).dir+"/.chef/knife.rb")
234
- Chef::Config.from_file(Etc.getpwuid(Process.uid).dir+"/.chef/knife.rb")
235
- end
236
- deadnodes = []
237
- Chef::Config[:environment] = MU.environment
238
- q = Chef::Search::Query.new
267
+ if !@onlycloud and (@mommacat.nil? or @mommacat.numKittens(types: ["Server", "ServerPool"]) > 0) and !(Gem.paths and Gem.paths.home and !Dir.exist?("/opt/mu/lib"))
239
268
  begin
240
- q.search("node", "tags_MU-ID:#{MU.deploy_id}").each { |item|
241
- next if item.is_a?(Integer)
242
- item.each { |node|
243
- deadnodes << node.name
269
+ MU::Groomer::Chef.loadChefLib
270
+ if File.exist?(Etc.getpwuid(Process.uid).dir+"/.chef/knife.rb")
271
+ Chef::Config.from_file(Etc.getpwuid(Process.uid).dir+"/.chef/knife.rb")
272
+ end
273
+ deadnodes = []
274
+ Chef::Config[:environment] = MU.environment
275
+ q = Chef::Search::Query.new
276
+ begin
277
+ q.search("node", "tags_MU-ID:#{MU.deploy_id}").each { |item|
278
+ next if item.is_a?(Integer)
279
+ item.each { |node|
280
+ deadnodes << node.name
281
+ }
244
282
  }
245
- }
246
- rescue Net::HTTPServerException
247
- end
283
+ rescue Net::HTTPServerException
284
+ end
248
285
 
249
- begin
250
- q.search("node", "name:#{MU.deploy_id}-*").each { |item|
251
- next if item.is_a?(Integer)
252
- item.each { |node|
253
- deadnodes << node.name
286
+ begin
287
+ q.search("node", "name:#{MU.deploy_id}-*").each { |item|
288
+ next if item.is_a?(Integer)
289
+ item.each { |node|
290
+ deadnodes << node.name
291
+ }
254
292
  }
293
+ rescue Net::HTTPServerException
294
+ end
295
+ MU.log "Missed some Chef resources in node cleanup, purging now", MU::NOTICE if deadnodes.size > 0
296
+ deadnodes.uniq.each { |node|
297
+ MU::Groomer::Chef.cleanup(node, [], noop)
255
298
  }
256
- rescue Net::HTTPServerException
299
+ rescue LoadError
257
300
  end
258
- MU.log "Missed some Chef resources in node cleanup, purging now", MU::NOTICE if deadnodes.size > 0
259
- deadnodes.uniq.each { |node|
260
- MU::Groomer::Chef.cleanup(node, [], noop)
261
- }
262
301
  end
263
302
 
264
303
  if !@onlycloud and !@noop and @mommacat
@@ -270,18 +309,18 @@ module MU
270
309
  sshconf = "#{sshdir}/config"
271
310
  ssharchive = "#{sshdir}/archive"
272
311
 
273
- Dir.mkdir(sshdir, 0700) if !Dir.exists?(sshdir) and !@noop
274
- Dir.mkdir(ssharchive, 0700) if !Dir.exists?(ssharchive) and !@noop
312
+ Dir.mkdir(sshdir, 0700) if !Dir.exist?(sshdir) and !@noop
313
+ Dir.mkdir(ssharchive, 0700) if !Dir.exist?(ssharchive) and !@noop
275
314
 
276
315
  keyname = "deploy-#{MU.deploy_id}"
277
- if File.exists?("#{sshdir}/#{keyname}")
316
+ if File.exist?("#{sshdir}/#{keyname}")
278
317
  MU.log "Moving #{sshdir}/#{keyname} to #{ssharchive}/#{keyname}"
279
318
  if !@noop
280
319
  File.rename("#{sshdir}/#{keyname}", "#{ssharchive}/#{keyname}")
281
320
  end
282
321
  end
283
322
 
284
- if File.exists?(sshconf) and File.open(sshconf).read.match(/\/deploy\-#{MU.deploy_id}$/)
323
+ if File.exist?(sshconf) and File.open(sshconf).read.match(/\/deploy\-#{MU.deploy_id}$/)
285
324
  MU.log "Expunging #{MU.deploy_id} from #{sshconf}"
286
325
  if !@noop
287
326
  FileUtils.copy(sshconf, "#{ssharchive}/config-#{MU.deploy_id}")
@@ -309,21 +348,25 @@ module MU
309
348
  # XXX refactor with above? They're similar, ish.
310
349
  hostsfile = "/etc/hosts"
311
350
  if File.open(hostsfile).read.match(/ #{MU.deploy_id}\-/)
312
- MU.log "Expunging traces of #{MU.deploy_id} from #{hostsfile}"
313
- if !@noop
314
- FileUtils.copy(hostsfile, "#{hostsfile}.cleanup-#{deploy_id}")
315
- File.open(hostsfile, File::CREAT|File::RDWR, 0644) { |f|
316
- f.flock(File::LOCK_EX)
317
- newlines = Array.new
318
- f.readlines.each { |line|
319
- newlines << line if !line.match(/ #{MU.deploy_id}\-/)
351
+ if Process.uid == 0
352
+ MU.log "Expunging traces of #{MU.deploy_id} from #{hostsfile}"
353
+ if !@noop
354
+ FileUtils.copy(hostsfile, "#{hostsfile}.cleanup-#{deploy_id}")
355
+ File.open(hostsfile, File::CREAT|File::RDWR, 0644) { |f|
356
+ f.flock(File::LOCK_EX)
357
+ newlines = Array.new
358
+ f.readlines.each { |line|
359
+ newlines << line if !line.match(/ #{MU.deploy_id}\-/)
360
+ }
361
+ f.rewind
362
+ f.truncate(0)
363
+ f.puts(newlines)
364
+ f.flush
365
+ f.flock(File::LOCK_UN)
320
366
  }
321
- f.rewind
322
- f.truncate(0)
323
- f.puts(newlines)
324
- f.flush
325
- f.flock(File::LOCK_UN)
326
- }
367
+ end
368
+ else
369
+ MU.log "Residual /etc/hosts entries for #{MU.deploy_id} must be removed by root user", MU::WARN
327
370
  end
328
371
  end
329
372
 
@@ -354,5 +397,39 @@ module MU
354
397
  end
355
398
 
356
399
  end
400
+
401
+ private
402
+
403
+ def self.call_cleanup(type, credset, provider, flags, region)
404
+ if @mommacat.nil? or @mommacat.numKittens(types: [type]) > 0
405
+ if @mommacat
406
+ found = @mommacat.findLitterMate(type: type, return_all: true, credentials: credset)
407
+ flags['known'] ||= []
408
+ if found.is_a?(Array)
409
+ found.each { |k|
410
+ flags['known'] << k.cloud_id
411
+ }
412
+ elsif found and found.is_a?(Hash)
413
+ flags['known'] << found['cloud_id']
414
+ elsif found
415
+ flags['known'] << found.cloud_id
416
+ end
417
+ end
418
+ # begin
419
+ resclass = Object.const_get("MU").const_get("Cloud").const_get(type)
420
+
421
+ resclass.cleanup(
422
+ noop: @noop,
423
+ ignoremaster: @ignoremaster,
424
+ region: region,
425
+ cloud: provider,
426
+ flags: flags,
427
+ credentials: credset
428
+ )
429
+ # rescue ::Seahorse::Client::NetworkingError => e
430
+ # MU.log "Service not available in AWS region #{r}, skipping", MU::DEBUG, details: e.message
431
+ # end
432
+ end
433
+ end
357
434
  end #class
358
435
  end #module