cloud-mu 3.1.3 → 3.3.0

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 (212) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +15 -3
  3. data/ansible/roles/mu-windows/README.md +33 -0
  4. data/ansible/roles/mu-windows/defaults/main.yml +2 -0
  5. data/ansible/roles/mu-windows/files/LaunchConfig.json +9 -0
  6. data/ansible/roles/mu-windows/files/config.xml +76 -0
  7. data/ansible/roles/mu-windows/handlers/main.yml +2 -0
  8. data/ansible/roles/mu-windows/meta/main.yml +53 -0
  9. data/ansible/roles/mu-windows/tasks/main.yml +36 -0
  10. data/ansible/roles/mu-windows/tests/inventory +2 -0
  11. data/ansible/roles/mu-windows/tests/test.yml +5 -0
  12. data/ansible/roles/mu-windows/vars/main.yml +2 -0
  13. data/bin/mu-adopt +21 -13
  14. data/bin/mu-azure-tests +57 -0
  15. data/bin/mu-cleanup +2 -4
  16. data/bin/mu-configure +52 -0
  17. data/bin/mu-deploy +3 -3
  18. data/bin/mu-findstray-tests +25 -0
  19. data/bin/mu-gen-docs +2 -4
  20. data/bin/mu-load-config.rb +4 -4
  21. data/bin/mu-node-manage +15 -16
  22. data/bin/mu-run-tests +147 -37
  23. data/cloud-mu.gemspec +22 -20
  24. data/cookbooks/mu-activedirectory/resources/domain.rb +4 -4
  25. data/cookbooks/mu-activedirectory/resources/domain_controller.rb +4 -4
  26. data/cookbooks/mu-tools/libraries/helper.rb +3 -2
  27. data/cookbooks/mu-tools/libraries/monkey.rb +35 -0
  28. data/cookbooks/mu-tools/recipes/apply_security.rb +14 -14
  29. data/cookbooks/mu-tools/recipes/aws_api.rb +9 -0
  30. data/cookbooks/mu-tools/recipes/eks.rb +2 -2
  31. data/cookbooks/mu-tools/recipes/google_api.rb +2 -2
  32. data/cookbooks/mu-tools/recipes/selinux.rb +2 -1
  33. data/cookbooks/mu-tools/recipes/windows-client.rb +163 -164
  34. data/cookbooks/mu-tools/resources/disk.rb +1 -1
  35. data/cookbooks/mu-tools/resources/windows_users.rb +44 -43
  36. data/extras/clean-stock-amis +25 -19
  37. data/extras/generate-stock-images +1 -0
  38. data/extras/image-generators/AWS/win2k12.yaml +18 -13
  39. data/extras/image-generators/AWS/win2k16.yaml +18 -13
  40. data/extras/image-generators/AWS/win2k19.yaml +21 -0
  41. data/extras/image-generators/Google/centos6.yaml +1 -0
  42. data/extras/image-generators/Google/centos7.yaml +1 -1
  43. data/modules/mommacat.ru +6 -16
  44. data/modules/mu.rb +158 -111
  45. data/modules/mu/adoption.rb +404 -71
  46. data/modules/mu/cleanup.rb +221 -306
  47. data/modules/mu/cloud.rb +129 -1633
  48. data/modules/mu/cloud/database.rb +49 -0
  49. data/modules/mu/cloud/dnszone.rb +44 -0
  50. data/modules/mu/cloud/machine_images.rb +212 -0
  51. data/modules/mu/cloud/providers.rb +81 -0
  52. data/modules/mu/cloud/resource_base.rb +926 -0
  53. data/modules/mu/cloud/server.rb +40 -0
  54. data/modules/mu/cloud/server_pool.rb +1 -0
  55. data/modules/mu/cloud/ssh_sessions.rb +228 -0
  56. data/modules/mu/cloud/winrm_sessions.rb +237 -0
  57. data/modules/mu/cloud/wrappers.rb +169 -0
  58. data/modules/mu/config.rb +171 -1767
  59. data/modules/mu/config/alarm.rb +2 -6
  60. data/modules/mu/config/bucket.rb +32 -3
  61. data/modules/mu/config/cache_cluster.rb +2 -2
  62. data/modules/mu/config/cdn.rb +100 -0
  63. data/modules/mu/config/collection.rb +4 -4
  64. data/modules/mu/config/container_cluster.rb +9 -4
  65. data/modules/mu/config/database.rb +84 -105
  66. data/modules/mu/config/database.yml +1 -2
  67. data/modules/mu/config/dnszone.rb +10 -9
  68. data/modules/mu/config/doc_helpers.rb +516 -0
  69. data/modules/mu/config/endpoint.rb +5 -4
  70. data/modules/mu/config/firewall_rule.rb +103 -4
  71. data/modules/mu/config/folder.rb +4 -4
  72. data/modules/mu/config/function.rb +19 -10
  73. data/modules/mu/config/group.rb +4 -4
  74. data/modules/mu/config/habitat.rb +4 -4
  75. data/modules/mu/config/job.rb +89 -0
  76. data/modules/mu/config/loadbalancer.rb +60 -14
  77. data/modules/mu/config/log.rb +4 -4
  78. data/modules/mu/config/msg_queue.rb +4 -4
  79. data/modules/mu/config/nosqldb.rb +4 -4
  80. data/modules/mu/config/notifier.rb +10 -21
  81. data/modules/mu/config/ref.rb +411 -0
  82. data/modules/mu/config/role.rb +4 -4
  83. data/modules/mu/config/schema_helpers.rb +509 -0
  84. data/modules/mu/config/search_domain.rb +4 -4
  85. data/modules/mu/config/server.rb +98 -71
  86. data/modules/mu/config/server.yml +1 -0
  87. data/modules/mu/config/server_pool.rb +5 -9
  88. data/modules/mu/config/storage_pool.rb +1 -1
  89. data/modules/mu/config/tail.rb +200 -0
  90. data/modules/mu/config/user.rb +4 -4
  91. data/modules/mu/config/vpc.rb +71 -27
  92. data/modules/mu/config/vpc.yml +0 -1
  93. data/modules/mu/defaults/AWS.yaml +91 -68
  94. data/modules/mu/defaults/Azure.yaml +1 -0
  95. data/modules/mu/defaults/Google.yaml +3 -2
  96. data/modules/mu/deploy.rb +43 -26
  97. data/modules/mu/groomer.rb +17 -2
  98. data/modules/mu/groomers/ansible.rb +188 -41
  99. data/modules/mu/groomers/chef.rb +116 -55
  100. data/modules/mu/logger.rb +127 -148
  101. data/modules/mu/master.rb +410 -2
  102. data/modules/mu/master/chef.rb +3 -4
  103. data/modules/mu/master/ldap.rb +3 -3
  104. data/modules/mu/master/ssl.rb +12 -3
  105. data/modules/mu/mommacat.rb +218 -2612
  106. data/modules/mu/mommacat/daemon.rb +403 -0
  107. data/modules/mu/mommacat/naming.rb +473 -0
  108. data/modules/mu/mommacat/search.rb +495 -0
  109. data/modules/mu/mommacat/storage.rb +722 -0
  110. data/modules/mu/{clouds → providers}/README.md +1 -1
  111. data/modules/mu/{clouds → providers}/aws.rb +380 -122
  112. data/modules/mu/{clouds → providers}/aws/alarm.rb +7 -5
  113. data/modules/mu/{clouds → providers}/aws/bucket.rb +297 -59
  114. data/modules/mu/{clouds → providers}/aws/cache_cluster.rb +37 -71
  115. data/modules/mu/providers/aws/cdn.rb +782 -0
  116. data/modules/mu/{clouds → providers}/aws/collection.rb +26 -25
  117. data/modules/mu/{clouds → providers}/aws/container_cluster.rb +724 -744
  118. data/modules/mu/providers/aws/database.rb +1744 -0
  119. data/modules/mu/{clouds → providers}/aws/dnszone.rb +88 -70
  120. data/modules/mu/providers/aws/endpoint.rb +1072 -0
  121. data/modules/mu/{clouds → providers}/aws/firewall_rule.rb +220 -247
  122. data/modules/mu/{clouds → providers}/aws/folder.rb +8 -8
  123. data/modules/mu/{clouds → providers}/aws/function.rb +300 -142
  124. data/modules/mu/{clouds → providers}/aws/group.rb +31 -29
  125. data/modules/mu/{clouds → providers}/aws/habitat.rb +18 -15
  126. data/modules/mu/providers/aws/job.rb +466 -0
  127. data/modules/mu/{clouds → providers}/aws/loadbalancer.rb +66 -56
  128. data/modules/mu/{clouds → providers}/aws/log.rb +17 -14
  129. data/modules/mu/{clouds → providers}/aws/msg_queue.rb +29 -19
  130. data/modules/mu/{clouds → providers}/aws/nosqldb.rb +114 -16
  131. data/modules/mu/{clouds → providers}/aws/notifier.rb +142 -65
  132. data/modules/mu/{clouds → providers}/aws/role.rb +158 -118
  133. data/modules/mu/{clouds → providers}/aws/search_domain.rb +201 -59
  134. data/modules/mu/{clouds → providers}/aws/server.rb +844 -1139
  135. data/modules/mu/{clouds → providers}/aws/server_pool.rb +74 -65
  136. data/modules/mu/{clouds → providers}/aws/storage_pool.rb +26 -44
  137. data/modules/mu/{clouds → providers}/aws/user.rb +24 -25
  138. data/modules/mu/{clouds → providers}/aws/userdata/README.md +0 -0
  139. data/modules/mu/{clouds → providers}/aws/userdata/linux.erb +5 -4
  140. data/modules/mu/{clouds → providers}/aws/userdata/windows.erb +2 -1
  141. data/modules/mu/{clouds → providers}/aws/vpc.rb +525 -931
  142. data/modules/mu/providers/aws/vpc_subnet.rb +286 -0
  143. data/modules/mu/{clouds → providers}/azure.rb +29 -9
  144. data/modules/mu/{clouds → providers}/azure/container_cluster.rb +3 -8
  145. data/modules/mu/{clouds → providers}/azure/firewall_rule.rb +18 -11
  146. data/modules/mu/{clouds → providers}/azure/habitat.rb +8 -6
  147. data/modules/mu/{clouds → providers}/azure/loadbalancer.rb +5 -5
  148. data/modules/mu/{clouds → providers}/azure/role.rb +8 -10
  149. data/modules/mu/{clouds → providers}/azure/server.rb +97 -49
  150. data/modules/mu/{clouds → providers}/azure/user.rb +6 -8
  151. data/modules/mu/{clouds → providers}/azure/userdata/README.md +0 -0
  152. data/modules/mu/{clouds → providers}/azure/userdata/linux.erb +0 -0
  153. data/modules/mu/{clouds → providers}/azure/userdata/windows.erb +0 -0
  154. data/modules/mu/{clouds → providers}/azure/vpc.rb +16 -21
  155. data/modules/mu/{clouds → providers}/cloudformation.rb +18 -7
  156. data/modules/mu/{clouds → providers}/cloudformation/alarm.rb +3 -3
  157. data/modules/mu/{clouds → providers}/cloudformation/cache_cluster.rb +3 -3
  158. data/modules/mu/{clouds → providers}/cloudformation/collection.rb +3 -3
  159. data/modules/mu/{clouds → providers}/cloudformation/database.rb +6 -17
  160. data/modules/mu/{clouds → providers}/cloudformation/dnszone.rb +3 -3
  161. data/modules/mu/{clouds → providers}/cloudformation/firewall_rule.rb +3 -3
  162. data/modules/mu/{clouds → providers}/cloudformation/loadbalancer.rb +3 -3
  163. data/modules/mu/{clouds → providers}/cloudformation/log.rb +3 -3
  164. data/modules/mu/{clouds → providers}/cloudformation/server.rb +7 -7
  165. data/modules/mu/{clouds → providers}/cloudformation/server_pool.rb +5 -5
  166. data/modules/mu/{clouds → providers}/cloudformation/vpc.rb +5 -7
  167. data/modules/mu/{clouds → providers}/docker.rb +0 -0
  168. data/modules/mu/{clouds → providers}/google.rb +68 -30
  169. data/modules/mu/{clouds → providers}/google/bucket.rb +13 -15
  170. data/modules/mu/{clouds → providers}/google/container_cluster.rb +85 -78
  171. data/modules/mu/{clouds → providers}/google/database.rb +11 -21
  172. data/modules/mu/{clouds → providers}/google/firewall_rule.rb +15 -14
  173. data/modules/mu/{clouds → providers}/google/folder.rb +20 -17
  174. data/modules/mu/{clouds → providers}/google/function.rb +140 -168
  175. data/modules/mu/{clouds → providers}/google/group.rb +29 -34
  176. data/modules/mu/{clouds → providers}/google/habitat.rb +21 -22
  177. data/modules/mu/{clouds → providers}/google/loadbalancer.rb +19 -21
  178. data/modules/mu/{clouds → providers}/google/role.rb +94 -58
  179. data/modules/mu/{clouds → providers}/google/server.rb +243 -156
  180. data/modules/mu/{clouds → providers}/google/server_pool.rb +26 -45
  181. data/modules/mu/{clouds → providers}/google/user.rb +95 -31
  182. data/modules/mu/{clouds → providers}/google/userdata/README.md +0 -0
  183. data/modules/mu/{clouds → providers}/google/userdata/linux.erb +0 -0
  184. data/modules/mu/{clouds → providers}/google/userdata/windows.erb +0 -0
  185. data/modules/mu/{clouds → providers}/google/vpc.rb +103 -79
  186. data/modules/tests/aws-jobs-functions.yaml +46 -0
  187. data/modules/tests/bucket.yml +4 -0
  188. data/modules/tests/centos6.yaml +15 -0
  189. data/modules/tests/centos7.yaml +15 -0
  190. data/modules/tests/centos8.yaml +12 -0
  191. data/modules/tests/ecs.yaml +23 -0
  192. data/modules/tests/eks.yaml +1 -1
  193. data/modules/tests/functions/node-function/lambda_function.js +10 -0
  194. data/modules/tests/functions/python-function/lambda_function.py +12 -0
  195. data/modules/tests/includes-and-params.yaml +2 -1
  196. data/modules/tests/microservice_app.yaml +288 -0
  197. data/modules/tests/rds.yaml +108 -0
  198. data/modules/tests/regrooms/aws-iam.yaml +201 -0
  199. data/modules/tests/regrooms/bucket.yml +19 -0
  200. data/modules/tests/regrooms/rds.yaml +123 -0
  201. data/modules/tests/server-with-scrub-muisms.yaml +2 -1
  202. data/modules/tests/super_complex_bok.yml +2 -2
  203. data/modules/tests/super_simple_bok.yml +3 -5
  204. data/modules/tests/win2k12.yaml +17 -5
  205. data/modules/tests/win2k16.yaml +25 -0
  206. data/modules/tests/win2k19.yaml +25 -0
  207. data/requirements.txt +1 -0
  208. data/spec/mu/clouds/azure_spec.rb +2 -2
  209. metadata +240 -154
  210. data/extras/image-generators/AWS/windows.yaml +0 -18
  211. data/modules/mu/clouds/aws/database.rb +0 -1985
  212. data/modules/mu/clouds/aws/endpoint.rb +0 -592
@@ -163,7 +163,7 @@ module MU
163
163
  dnsthread = Thread.new {
164
164
  if !MU::Cloud::AWS.isGovCloud?
165
165
  MU.dupGlobals(parent_thread_id)
166
- generic_mu_dns = MU::Cloud::AWS::DNSZone.genericMuDNSEntry(name: @mu_name, target: "#{lb.dns_name}.", cloudclass: MU::Cloud::LoadBalancer, sync_wait: @config['dns_sync_wait'])
166
+ generic_mu_dns = MU::Cloud.resourceClass("AWS", "DNSZone").genericMuDNSEntry(name: @mu_name, target: "#{lb.dns_name}.", cloudclass: MU::Cloud::LoadBalancer, sync_wait: @config['dns_sync_wait'])
167
167
  end
168
168
  }
169
169
 
@@ -239,16 +239,35 @@ module MU
239
239
  end
240
240
  end
241
241
 
242
+ redirect_block = Proc.new { |r|
243
+ {
244
+ :protocol => r['protocol'],
245
+ :port => r['port'].to_s,
246
+ :host => r['host'],
247
+ :path => r['path'],
248
+ :query => r['query'],
249
+ :status_code => "HTTP_"+r['status_code'].to_s
250
+ }
251
+ }
252
+
242
253
  if !@config['classic']
243
254
  @config["listeners"].each { |l|
244
- if !@targetgroups.has_key?(l['targetgroup'])
245
- raise MuError, "Listener in #{@mu_name} configured for target group #{l['targetgroup']}, but I don't have data on a targetgroup by that name"
246
- end
247
- listen_descriptor = {
248
- :default_actions => [{
255
+ action = if l['redirect']
256
+ {
257
+ :type => "redirect",
258
+ :redirect_config => redirect_block.call(l['redirect'])
259
+ }
260
+ else
261
+ if !@targetgroups.has_key?(l['targetgroup'])
262
+ raise MuError, "Listener in #{@mu_name} configured for target group #{l['targetgroup']}, but I don't have data on a targetgroup by that name"
263
+ end
264
+ {
249
265
  :target_group_arn => @targetgroups[l['targetgroup']].target_group_arn,
250
266
  :type => "forward"
251
- }],
267
+ }
268
+ end
269
+ listen_descriptor = {
270
+ :default_actions => [ action ],
252
271
  :load_balancer_arn => lb.load_balancer_arn,
253
272
  :port => l['lb_port'],
254
273
  :protocol => l['lb_protocol']
@@ -276,10 +295,17 @@ module MU
276
295
  :actions => []
277
296
  }
278
297
  rule['actions'].each { |a|
279
- rule_descriptor[:actions] << {
280
- :target_group_arn => @targetgroups[a['targetgroup']].target_group_arn,
281
- :type => a['action']
282
- }
298
+ rule_descriptor[:actions] << if a['action'] == "forward"
299
+ {
300
+ :target_group_arn => @targetgroups[a['targetgroup']].target_group_arn,
301
+ :type => a['action']
302
+ }
303
+ elsif a['action'] == "redirect"
304
+ {
305
+ :redirect_config => redirect_block.call(rule['redirect']),
306
+ :type => a['action']
307
+ }
308
+ end
283
309
  }
284
310
  MU::Cloud::AWS.elb2(region: @config['region'], credentials: @config['credentials']).create_rule(rule_descriptor)
285
311
  }
@@ -288,7 +314,7 @@ module MU
288
314
  else
289
315
  @config["listeners"].each { |l|
290
316
  if l['ssl_certificate_id']
291
- resp = MU::Cloud::AWS.elb(region: @config['region'], credentials: @config['credentials']).set_load_balancer_policies_of_listener(
317
+ MU::Cloud::AWS.elb(region: @config['region'], credentials: @config['credentials']).set_load_balancer_policies_of_listener(
292
318
  load_balancer_name: @cloud_id,
293
319
  load_balancer_port: l['lb_port'],
294
320
  policy_names: [
@@ -330,7 +356,7 @@ module MU
330
356
  }
331
357
  )
332
358
  else
333
- @targetgroups.each_pair { |tg_name, tg|
359
+ @targetgroups.values.each { |tg|
334
360
  MU::Cloud::AWS.elb2(region: @config['region'], credentials: @config['credentials']).modify_target_group_attributes(
335
361
  target_group_arn: tg.target_group_arn,
336
362
  attributes: [
@@ -400,7 +426,7 @@ module MU
400
426
  timeout = 0
401
427
  MU.log "Disabling connection draining on #{lb.dns_name}"
402
428
  end
403
- @targetgroups.each_pair { |tg_name, tg|
429
+ @targetgroups.values.each { |tg|
404
430
  MU::Cloud::AWS.elb2(region: @config['region'], credentials: @config['credentials']).modify_target_group_attributes(
405
431
  target_group_arn: tg.target_group_arn,
406
432
  attributes: [
@@ -473,7 +499,7 @@ module MU
473
499
  end
474
500
  end
475
501
  else
476
- @targetgroups.each_pair { |tg_name, tg|
502
+ @targetgroups.values.each { |tg|
477
503
  MU::Cloud::AWS.elb2(region: @config['region'], credentials: @config['credentials']).modify_target_group_attributes(
478
504
  target_group_arn: tg.target_group_arn,
479
505
  attributes: [
@@ -536,7 +562,7 @@ module MU
536
562
  }
537
563
  end
538
564
  if !MU::Cloud::AWS.isGovCloud?
539
- MU::Cloud::AWS::DNSZone.createRecordsFromConfig(@config['dns_records'], target: cloud_desc.dns_name)
565
+ MU::Cloud.resourceClass("AWS", "DNSZone").createRecordsFromConfig(@config['dns_records'], target: cloud_desc.dns_name)
540
566
  end
541
567
  end
542
568
 
@@ -553,15 +579,18 @@ module MU
553
579
  end
554
580
  end
555
581
 
582
+ @cloud_desc_cache = nil
556
583
  # Wrapper for cloud_desc method that deals with elb vs. elb2 resources.
557
- def cloud_desc
584
+ def cloud_desc(use_cache: true)
585
+ return @cloud_desc_cache if @cloud_desc_cache and use_cache
586
+ return nil if !@cloud_id
558
587
  if @config['classic']
559
- resp = MU::Cloud::AWS.elb(region: @config['region'], credentials: @config['credentials']).describe_load_balancers(
588
+ @cloud_desc_cache = MU::Cloud::AWS.elb(region: @config['region'], credentials: @config['credentials']).describe_load_balancers(
560
589
  load_balancer_names: [@cloud_id]
561
590
  ).load_balancer_descriptions.first
562
- return resp
591
+ return @cloud_desc_cache
563
592
  else
564
- resp = MU::Cloud::AWS.elb2(region: @config['region'], credentials: @config['credentials']).describe_load_balancers(
593
+ @cloud_desc_cache = MU::Cloud::AWS.elb2(region: @config['region'], credentials: @config['credentials']).describe_load_balancers(
565
594
  names: [@cloud_id]
566
595
  ).load_balancers.first
567
596
  if @targetgroups.nil? and !@deploy.nil? and
@@ -573,7 +602,7 @@ module MU
573
602
  }
574
603
  end
575
604
 
576
- return resp
605
+ return @cloud_desc_cache
577
606
  end
578
607
  end
579
608
 
@@ -643,8 +672,8 @@ module MU
643
672
  # @param ignoremaster [Boolean]: If true, will remove resources not flagged as originating from this Mu server
644
673
  # @param region [String]: The cloud provider region
645
674
  # @return [void]
646
- def self.cleanup(noop: false, ignoremaster: false, region: MU.curRegion, credentials: nil, flags: {})
647
- if (MU.deploy_id.nil? or MU.deploy_id.empty?) and (!flags or !flags["vpc_id"])
675
+ def self.cleanup(noop: false, deploy_id: MU.deploy_id, ignoremaster: false, region: MU.curRegion, credentials: nil, flags: {})
676
+ if (deploy_id.nil? or deploy_id.empty?) and (!flags or !flags["vpc_id"])
648
677
  raise MuError, "Can't touch ELBs without MU-ID or vpc_id flag"
649
678
  end
650
679
 
@@ -654,7 +683,7 @@ module MU
654
683
  # @param region [String]: The cloud provider region
655
684
  # @param ignoremaster [Boolean]: Whether to ignore the MU-MASTER-IP tag
656
685
  # @param classic [Boolean]: Whether to look for a classic ELB instead of an ALB (ELB2)
657
- def self.checkForTagMatch(arn, region, ignoremaster, credentials, classic = false)
686
+ def self.checkForTagMatch(arn, region, ignoremaster, credentials, classic = false, deploy_id: MU.deploy_id)
658
687
  tags = []
659
688
  if classic
660
689
  tags = MU::Cloud::AWS.elb(credentials: credentials, region: region).describe_tags(
@@ -671,7 +700,7 @@ module MU
671
700
  if !tags.nil?
672
701
  tags.each { |tag|
673
702
  saw_tags << tag.key
674
- muid_match = true if tag.key == "MU-ID" and tag.value == MU.deploy_id
703
+ muid_match = true if tag.key == "MU-ID" and tag.value == deploy_id
675
704
  mumaster_match = true if tag.key == "MU-MASTER-IP" and tag.value == MU.mu_public_ip
676
705
  }
677
706
  end
@@ -692,20 +721,19 @@ module MU
692
721
  classic = false
693
722
  end
694
723
  begin
695
- tags = []
696
724
  matched = false
697
725
  if flags and flags['vpc_id']
698
726
  matched = true if lb.vpc_id == flags['vpc_id']
699
727
  else
700
728
  if classic
701
- matched = self.checkForTagMatch(lb.load_balancer_name, region, ignoremaster, credentials, classic)
729
+ matched = self.checkForTagMatch(lb.load_balancer_name, region, ignoremaster, credentials, classic, deploy_id: deploy_id)
702
730
  else
703
- matched = self.checkForTagMatch(lb.load_balancer_arn, region, ignoremaster, credentials, classic)
731
+ matched = self.checkForTagMatch(lb.load_balancer_arn, region, ignoremaster, credentials, classic, deploy_id: deploy_id)
704
732
  end
705
733
  end
706
734
  if matched
707
735
  if !MU::Cloud::AWS.isGovCloud?
708
- MU::Cloud::AWS::DNSZone.genericMuDNSEntry(name: lb.load_balancer_name, target: lb.dns_name, cloudclass: MU::Cloud::LoadBalancer, delete: true) if !noop
736
+ MU::Cloud.resourceClass("AWS", "DNSZone").genericMuDNSEntry(name: lb.load_balancer_name, target: lb.dns_name, cloudclass: MU::Cloud::LoadBalancer, delete: true) if !noop
709
737
  end
710
738
  if classic
711
739
  MU.log "Removing Elastic Load Balancer #{lb.load_balancer_name}"
@@ -746,7 +774,7 @@ module MU
746
774
 
747
775
 
748
776
  tgs.each { |tg|
749
- if self.checkForTagMatch(tg.target_group_arn, region, ignoremaster, credentials)
777
+ if self.checkForTagMatch(tg.target_group_arn, region, ignoremaster, credentials, deploy_id: deploy_id)
750
778
  MU.log "Removing Load Balancer Target Group #{tg.target_group_name}"
751
779
  retries = 0
752
780
  begin
@@ -773,9 +801,9 @@ module MU
773
801
  end
774
802
 
775
803
  # Cloud-specific configuration properties.
776
- # @param config [MU::Config]: The calling MU::Config object
804
+ # @param _config [MU::Config]: The calling MU::Config object
777
805
  # @return [Array<Array,Hash>]: List of required fields, and json-schema Hash of cloud-specific configuration parameters for this resource
778
- def self.schema(config)
806
+ def self.schema(_config)
779
807
  toplevel_required = []
780
808
  schema = {
781
809
  "targetgroups" => {
@@ -792,35 +820,16 @@ module MU
792
820
  }
793
821
  }
794
822
  },
795
- "ingress_rules" => {
796
- "items" => {
797
- "properties" => {
798
- "sgs" => {
799
- "type" => "array",
800
- "items" => {
801
- "description" => "Other AWS Security Groups; resources that are associated with this group will have this rule applied to their traffic",
802
- "type" => "string"
803
- }
804
- },
805
- "lbs" => {
806
- "type" => "array",
807
- "items" => {
808
- "description" => "AWS Load Balancers which will have this rule applied to their traffic",
809
- "type" => "string"
810
- }
811
- }
812
- }
813
- }
814
- }
823
+ "ingress_rules" => MU::Cloud.resourceClass("AWS", "FirewallRule").ingressRuleAddtlSchema
815
824
  }
816
825
  [toplevel_required, schema]
817
826
  end
818
827
 
819
828
  # Cloud-specific pre-processing of {MU::Config::BasketofKittens::loadbalancers}, bare and unvalidated.
820
829
  # @param lb [Hash]: The resource to process and validate
821
- # @param configurator [MU::Config]: The overall deployment configurator of which this resource is a member
830
+ # @param _configurator [MU::Config]: The overall deployment configurator of which this resource is a member
822
831
  # @return [Boolean]: True if validation succeeded, False otherwise
823
- def self.validateConfig(lb, configurator)
832
+ def self.validateConfig(lb, _configurator)
824
833
  ok = true
825
834
 
826
835
  # XXX what about raw targetgroup ssl declarations?
@@ -829,8 +838,8 @@ module MU
829
838
  (!listener["ssl_certificate_id"].nil? and !listener["ssl_certificate_id"].empty?)
830
839
  if lb['cloud'] != "CloudFormation" # XXX or maybe do this anyway?
831
840
  begin
832
- listener["ssl_certificate_id"] = MU::Cloud::AWS.findSSLCertificate(name: listener["ssl_certificate_name"].to_s, id: listener["ssl_certificate_id"].to_s, region: lb['region'])
833
- rescue MuError => e
841
+ listener["ssl_certificate_id"] = MU::Cloud::AWS.findSSLCertificate(name: listener["ssl_certificate_name"].to_s, id: listener["ssl_certificate_id"].to_s, region: lb['region']).first
842
+ rescue MuError
834
843
  ok = false
835
844
  next
836
845
  end
@@ -922,6 +931,7 @@ module MU
922
931
  return matches
923
932
 
924
933
  end
934
+
925
935
  end
926
936
  end
927
937
  end
@@ -202,11 +202,14 @@ module MU
202
202
  # @param ignoremaster [Boolean]: If true, will remove resources not flagged as originating from this Mu server
203
203
  # @param region [String]: The cloud provider region
204
204
  # @return [void]
205
- def self.cleanup(noop: false, ignoremaster: false, region: MU.curRegion, credentials: nil, flags: {})
205
+ def self.cleanup(noop: false, deploy_id: MU.deploy_id, ignoremaster: false, region: MU.curRegion, credentials: nil, flags: {})
206
+ MU.log "AWS::Log.cleanup: need to support flags['known']", MU::DEBUG, details: flags
207
+ MU.log "Placeholder: AWS Log artifacts do not support tags, so ignoremaster cleanup flag has no effect", MU::DEBUG, details: ignoremaster
208
+
206
209
  log_groups = self.find(credentials: credentials, region: region).values
207
210
  if !log_groups.empty?
208
211
  log_groups.each{ |lg|
209
- if lg.log_group_name.match(MU.deploy_id)
212
+ if lg.log_group_name.match(deploy_id)
210
213
  log_streams = MU::Cloud::AWS.cloudwatchlogs(credentials: credentials, region: region).describe_log_streams(log_group_name: lg.log_group_name).log_streams
211
214
  if !log_streams.empty?
212
215
  log_streams.each{ |ls|
@@ -227,13 +230,13 @@ module MU
227
230
  }
228
231
  end
229
232
 
230
- unless noop
231
- MU::Cloud::AWS.iam(credentials: credentials).list_roles.roles.each{ |role|
232
- match_string = "#{MU.deploy_id}.*CloudTrail"
233
- # Maybe we should have a more generic way to delete IAM profiles and policies. The call itself should be moved from MU::Cloud::AWS::Server.
234
- # MU::Cloud::AWS::Server.removeIAMProfile(role.role_name) if role.role_name.match(match_string)
235
- }
236
- end
233
+ # unless noop
234
+ # MU::Cloud::AWS.iam(credentials: credentials).list_roles.roles.each{ |role|
235
+ # match_string = "#{deploy_id}.*CloudTrail"
236
+ # Maybe we should have a more generic way to delete IAM profiles and policies. The call itself should be moved from MU::Cloud.resourceClass("AWS", "Server").
237
+ # MU::Cloud.resourceClass("AWS", "Server").removeIAMProfile(role.role_name) if role.role_name.match(match_string)
238
+ # }
239
+ # end
237
240
  end
238
241
 
239
242
  # Locate an existing log group.
@@ -264,7 +267,7 @@ module MU
264
267
  # Reverse-map our cloud description into a runnable config hash.
265
268
  # We assume that any values we have in +@config+ are placeholders, and
266
269
  # calculate our own accordingly based on what's live in the cloud.
267
- def toKitten(rootparent: nil, billing: nil, habitats: nil)
270
+ def toKitten(**_args)
268
271
  bok = {
269
272
  "cloud" => "AWS",
270
273
  "credentials" => @config['credentials'],
@@ -304,9 +307,9 @@ module MU
304
307
 
305
308
 
306
309
  # Cloud-specific configuration properties.
307
- # @param config [MU::Config]: The calling MU::Config object
310
+ # @param _config [MU::Config]: The calling MU::Config object
308
311
  # @return [Array<Array,Hash>]: List of required fields, and json-schema Hash of cloud-specific configuration parameters for this resource
309
- def self.schema(config)
312
+ def self.schema(_config)
310
313
  toplevel_required = []
311
314
  schema = {
312
315
  "retention_period" => {
@@ -357,9 +360,9 @@ module MU
357
360
 
358
361
  # Cloud-specific pre-processing of {MU::Config::BasketofKittens::logs}, bare and unvalidated.
359
362
  # @param log [Hash]: The resource to process and validate
360
- # @param configurator [MU::Config]: The overall deployment configurator of which this resource is a member
363
+ # @param _configurator [MU::Config]: The overall deployment configurator of which this resource is a member
361
364
  # @return [Boolean]: True if validation succeeded, False otherwise
362
- def self.validateConfig(log, configurator)
365
+ def self.validateConfig(log, _configurator)
363
366
  ok = true
364
367
 
365
368
  if log["filters"] && !log["filters"].empty?
@@ -53,14 +53,14 @@ module MU
53
53
  new_attrs = genQueueAttrs
54
54
 
55
55
  changed = false
56
- new_attrs.each_pair { |k, v|
56
+ new_attrs.each_pair { |k, _v|
57
57
  if !cur_attrs.has_key?(k) or cur_attrs[k] != new_attrs[k]
58
58
  changed = true
59
59
  end
60
60
  }
61
61
  if changed
62
62
  MU.log "Updating SQS queue #{@mu_name}", MU::NOTICE, details: new_attrs
63
- resp = MU::Cloud::AWS.sqs(region: @config['region'], credentials: @config['credentials']).set_queue_attributes(
63
+ MU::Cloud::AWS.sqs(region: @config['region'], credentials: @config['credentials']).set_queue_attributes(
64
64
  queue_url: @cloud_id,
65
65
  attributes: new_attrs
66
66
  )
@@ -74,10 +74,14 @@ module MU
74
74
  "arn:"+(MU::Cloud::AWS.isGovCloud?(@config["region"]) ? "aws-us-gov" : "aws")+":sqs:"+@config['region']+":"+MU::Cloud::AWS.credToAcct(@config['credentials'])+":"+@cloud_id
75
75
  end
76
76
 
77
+ @cloud_desc_cache = nil
77
78
  # Retrieve the AWS descriptor for this SQS queue. AWS doesn't exactly
78
79
  # provide one; if you want real information for SQS ask notify()
79
80
  # @return [Hash]: AWS doesn't return anything but the SQS URL, so supplement with attributes
80
- def cloud_desc
81
+ def cloud_desc(use_cache: true)
82
+ return @cloud_desc_cache if @cloud_desc_cache and use_cache
83
+ return nil if !@cloud_id
84
+
81
85
  if !@cloud_id
82
86
  resp = MU::Cloud::AWS.sqs(region: @config['region'], credentials: @config['credentials']).list_queues(
83
87
  queue_name_prefix: @mu_name
@@ -92,11 +96,12 @@ module MU
92
96
  end
93
97
 
94
98
  return nil if !@cloud_id
95
- MU::Cloud::AWS::MsgQueue.find(
99
+ @cloud_desc_cache = MU::Cloud::AWS::MsgQueue.find(
96
100
  cloud_id: @cloud_id.dup,
97
101
  region: @config['region'],
98
102
  credentials: @config['credentials']
99
103
  )
104
+ @cloud_desc_cache
100
105
  end
101
106
 
102
107
  # Return the metadata for this MsgQueue rule
@@ -129,9 +134,12 @@ module MU
129
134
  # @param ignoremaster [Boolean]: If true, will remove resources not flagged as originating from this Mu server
130
135
  # @param region [String]: The cloud provider region
131
136
  # @return [void]
132
- def self.cleanup(noop: false, ignoremaster: false, region: MU.curRegion, credentials: nil, flags: {})
137
+ def self.cleanup(noop: false, deploy_id: MU.deploy_id, ignoremaster: false, region: MU.curRegion, credentials: nil, flags: {})
138
+ MU.log "AWS::MsgQueue.cleanup: need to support flags['known']", MU::DEBUG, details: flags
139
+ MU.log "Placeholder: AWS MsgQueue artifacts do not support tags, so ignoremaster cleanup flag has no effect", MU::DEBUG, details: ignoremaster
140
+
133
141
  resp = MU::Cloud::AWS.sqs(credentials: credentials, region: region).list_queues(
134
- queue_name_prefix: MU.deploy_id
142
+ queue_name_prefix: deploy_id
135
143
  )
136
144
  if resp and resp.queue_urls
137
145
  threads = []
@@ -182,12 +190,20 @@ module MU
182
190
  args[:cloud_id] = resp.queue_url if resp and resp.queue_url
183
191
  end
184
192
  end
185
- rescue ::Aws::SQS::Errors::NonExistentQueue => e
193
+ rescue ::Aws::SQS::Errors::NonExistentQueue
186
194
  end
187
195
 
188
196
  # Go fetch its attributes
189
197
  fetch = if args[:cloud_id]
190
- [args[:cloud_id]]
198
+ if args[:cloud_id] !~ /^https?:\/\//
199
+ [begin
200
+ MU::Cloud::AWS.sqs(region: args[:region], credentials: args[:credentials]).get_queue_url(queue_name: args[:cloud_id]).queue_url
201
+ rescue Aws::SQS::Errors::NonExistentQueue
202
+ return found
203
+ end]
204
+ else
205
+ [args[:cloud_id]]
206
+ end
191
207
  else
192
208
  resp = MU::Cloud::AWS.sqs(region: args[:region], credentials: args[:credentials]).list_queues
193
209
  resp.queue_urls
@@ -211,9 +227,9 @@ module MU
211
227
  end
212
228
 
213
229
  # Cloud-specific configuration properties.
214
- # @param config [MU::Config]: The calling MU::Config object
230
+ # @param _config [MU::Config]: The calling MU::Config object
215
231
  # @return [Array<Array,Hash>]: List of required fields, and json-schema Hash of cloud-specific configuration parameters for this resource
216
- def self.schema(config)
232
+ def self.schema(_config)
217
233
  toplevel_required = []
218
234
  schema = {
219
235
  "max_msg_size" => {
@@ -320,16 +336,10 @@ module MU
320
336
  failq.delete("failqueue")
321
337
  ok = false if !configurator.insertKitten(failq, "msg_queues")
322
338
  queue['failqueue']['name'] = failq['name']
323
- queue['dependencies'] << {
324
- "name" => failq['name'],
325
- "type" => "msg_queue"
326
- }
339
+ MU::Config.addDependency(queue, failq["name"], "msg_queue")
327
340
  else
328
341
  if configurator.haveLitterMate?(queue['failqueue']['name'], "msg_queue")
329
- queue['dependencies'] << {
330
- "name" => queue['failqueue']['name'],
331
- "type" => "msg_queue"
332
- }
342
+ MU::Config.addDependency(queue, queue['failqueue']['name'], "msg_queue")
333
343
  else
334
344
  failq = MU::Cloud::AWS::MsgQueue.find(cloud_id: queue['failqueue']['name'])
335
345
  if !failq
@@ -382,7 +392,7 @@ module MU
382
392
  end
383
393
  begin
384
394
  MU::Cloud::AWS.kms(region: queue['region']).describe_key(key_id: queue['kms']['key_id'])
385
- rescue Aws::KMS::Errors::NotFoundException => e
395
+ rescue Aws::KMS::Errors::NotFoundException
386
396
  MU.log "KMS key '#{queue['kms']['key_id']}' specified in Queue '#{queue['name']}' was not found.", MU::ERR, details: "Key IDs are of the form bf64a093-2c3d-46fa-0d4f-8232fa7ed53. Keys can be created at https://console.aws.amazon.com/iam/home#/encryptionKeys/#{queue['region']}"
387
397
  ok = false
388
398
  end