cloud-mu 3.1.6 → 3.2.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 (154) hide show
  1. checksums.yaml +4 -4
  2. data/bin/mu-adopt +4 -12
  3. data/bin/mu-azure-tests +57 -0
  4. data/bin/mu-cleanup +2 -4
  5. data/bin/mu-configure +37 -1
  6. data/bin/mu-deploy +3 -3
  7. data/bin/mu-findstray-tests +25 -0
  8. data/bin/mu-gen-docs +2 -4
  9. data/bin/mu-run-tests +23 -10
  10. data/cloud-mu.gemspec +2 -2
  11. data/cookbooks/mu-tools/libraries/helper.rb +1 -1
  12. data/cookbooks/mu-tools/recipes/apply_security.rb +14 -14
  13. data/cookbooks/mu-tools/recipes/aws_api.rb +9 -0
  14. data/extras/generate-stock-images +1 -0
  15. data/modules/mu.rb +82 -95
  16. data/modules/mu/adoption.rb +356 -56
  17. data/modules/mu/cleanup.rb +21 -20
  18. data/modules/mu/cloud.rb +79 -1753
  19. data/modules/mu/cloud/database.rb +49 -0
  20. data/modules/mu/cloud/dnszone.rb +46 -0
  21. data/modules/mu/cloud/machine_images.rb +212 -0
  22. data/modules/mu/cloud/providers.rb +81 -0
  23. data/modules/mu/cloud/resource_base.rb +920 -0
  24. data/modules/mu/cloud/server.rb +40 -0
  25. data/modules/mu/cloud/server_pool.rb +1 -0
  26. data/modules/mu/cloud/ssh_sessions.rb +228 -0
  27. data/modules/mu/cloud/winrm_sessions.rb +237 -0
  28. data/modules/mu/cloud/wrappers.rb +165 -0
  29. data/modules/mu/config.rb +122 -80
  30. data/modules/mu/config/alarm.rb +2 -6
  31. data/modules/mu/config/bucket.rb +1 -1
  32. data/modules/mu/config/cache_cluster.rb +1 -1
  33. data/modules/mu/config/collection.rb +1 -1
  34. data/modules/mu/config/container_cluster.rb +2 -2
  35. data/modules/mu/config/database.rb +83 -104
  36. data/modules/mu/config/database.yml +1 -2
  37. data/modules/mu/config/dnszone.rb +1 -1
  38. data/modules/mu/config/doc_helpers.rb +4 -5
  39. data/modules/mu/config/endpoint.rb +1 -1
  40. data/modules/mu/config/firewall_rule.rb +3 -19
  41. data/modules/mu/config/folder.rb +1 -1
  42. data/modules/mu/config/function.rb +1 -1
  43. data/modules/mu/config/group.rb +1 -1
  44. data/modules/mu/config/habitat.rb +1 -1
  45. data/modules/mu/config/loadbalancer.rb +57 -11
  46. data/modules/mu/config/log.rb +1 -1
  47. data/modules/mu/config/msg_queue.rb +1 -1
  48. data/modules/mu/config/nosqldb.rb +1 -1
  49. data/modules/mu/config/notifier.rb +1 -1
  50. data/modules/mu/config/ref.rb +30 -4
  51. data/modules/mu/config/role.rb +1 -1
  52. data/modules/mu/config/schema_helpers.rb +30 -34
  53. data/modules/mu/config/search_domain.rb +1 -1
  54. data/modules/mu/config/server.rb +4 -12
  55. data/modules/mu/config/server_pool.rb +3 -7
  56. data/modules/mu/config/storage_pool.rb +1 -1
  57. data/modules/mu/config/tail.rb +10 -0
  58. data/modules/mu/config/user.rb +1 -1
  59. data/modules/mu/config/vpc.rb +12 -17
  60. data/modules/mu/defaults/AWS.yaml +32 -32
  61. data/modules/mu/defaults/Azure.yaml +1 -0
  62. data/modules/mu/defaults/Google.yaml +1 -0
  63. data/modules/mu/deploy.rb +16 -15
  64. data/modules/mu/groomer.rb +15 -0
  65. data/modules/mu/groomers/chef.rb +3 -0
  66. data/modules/mu/logger.rb +120 -144
  67. data/modules/mu/master.rb +1 -1
  68. data/modules/mu/mommacat.rb +54 -25
  69. data/modules/mu/mommacat/daemon.rb +10 -7
  70. data/modules/mu/mommacat/naming.rb +82 -3
  71. data/modules/mu/mommacat/search.rb +47 -15
  72. data/modules/mu/mommacat/storage.rb +72 -41
  73. data/modules/mu/{clouds → providers}/README.md +1 -1
  74. data/modules/mu/{clouds → providers}/aws.rb +114 -47
  75. data/modules/mu/{clouds → providers}/aws/alarm.rb +1 -1
  76. data/modules/mu/{clouds → providers}/aws/bucket.rb +2 -2
  77. data/modules/mu/{clouds → providers}/aws/cache_cluster.rb +10 -46
  78. data/modules/mu/{clouds → providers}/aws/collection.rb +3 -3
  79. data/modules/mu/{clouds → providers}/aws/container_cluster.rb +15 -33
  80. data/modules/mu/providers/aws/database.rb +1744 -0
  81. data/modules/mu/{clouds → providers}/aws/dnszone.rb +2 -5
  82. data/modules/mu/{clouds → providers}/aws/endpoint.rb +2 -11
  83. data/modules/mu/{clouds → providers}/aws/firewall_rule.rb +33 -29
  84. data/modules/mu/{clouds → providers}/aws/folder.rb +0 -0
  85. data/modules/mu/{clouds → providers}/aws/function.rb +2 -10
  86. data/modules/mu/{clouds → providers}/aws/group.rb +9 -13
  87. data/modules/mu/{clouds → providers}/aws/habitat.rb +1 -1
  88. data/modules/mu/{clouds → providers}/aws/loadbalancer.rb +41 -33
  89. data/modules/mu/{clouds → providers}/aws/log.rb +2 -2
  90. data/modules/mu/{clouds → providers}/aws/msg_queue.rb +2 -8
  91. data/modules/mu/{clouds → providers}/aws/nosqldb.rb +0 -0
  92. data/modules/mu/{clouds → providers}/aws/notifier.rb +0 -0
  93. data/modules/mu/{clouds → providers}/aws/role.rb +7 -7
  94. data/modules/mu/{clouds → providers}/aws/search_domain.rb +8 -13
  95. data/modules/mu/{clouds → providers}/aws/server.rb +55 -90
  96. data/modules/mu/{clouds → providers}/aws/server_pool.rb +10 -33
  97. data/modules/mu/{clouds → providers}/aws/storage_pool.rb +19 -36
  98. data/modules/mu/{clouds → providers}/aws/user.rb +8 -12
  99. data/modules/mu/{clouds → providers}/aws/userdata/README.md +0 -0
  100. data/modules/mu/{clouds → providers}/aws/userdata/linux.erb +0 -0
  101. data/modules/mu/{clouds → providers}/aws/userdata/windows.erb +0 -0
  102. data/modules/mu/{clouds → providers}/aws/vpc.rb +135 -70
  103. data/modules/mu/{clouds → providers}/aws/vpc_subnet.rb +0 -0
  104. data/modules/mu/{clouds → providers}/azure.rb +4 -1
  105. data/modules/mu/{clouds → providers}/azure/container_cluster.rb +1 -5
  106. data/modules/mu/{clouds → providers}/azure/firewall_rule.rb +8 -1
  107. data/modules/mu/{clouds → providers}/azure/habitat.rb +0 -0
  108. data/modules/mu/{clouds → providers}/azure/loadbalancer.rb +0 -0
  109. data/modules/mu/{clouds → providers}/azure/role.rb +0 -0
  110. data/modules/mu/{clouds → providers}/azure/server.rb +30 -23
  111. data/modules/mu/{clouds → providers}/azure/user.rb +1 -1
  112. data/modules/mu/{clouds → providers}/azure/userdata/README.md +0 -0
  113. data/modules/mu/{clouds → providers}/azure/userdata/linux.erb +0 -0
  114. data/modules/mu/{clouds → providers}/azure/userdata/windows.erb +0 -0
  115. data/modules/mu/{clouds → providers}/azure/vpc.rb +4 -6
  116. data/modules/mu/{clouds → providers}/cloudformation.rb +1 -1
  117. data/modules/mu/{clouds → providers}/cloudformation/alarm.rb +3 -3
  118. data/modules/mu/{clouds → providers}/cloudformation/cache_cluster.rb +3 -3
  119. data/modules/mu/{clouds → providers}/cloudformation/collection.rb +3 -3
  120. data/modules/mu/{clouds → providers}/cloudformation/database.rb +6 -17
  121. data/modules/mu/{clouds → providers}/cloudformation/dnszone.rb +3 -3
  122. data/modules/mu/{clouds → providers}/cloudformation/firewall_rule.rb +3 -3
  123. data/modules/mu/{clouds → providers}/cloudformation/loadbalancer.rb +3 -3
  124. data/modules/mu/{clouds → providers}/cloudformation/log.rb +3 -3
  125. data/modules/mu/{clouds → providers}/cloudformation/server.rb +7 -7
  126. data/modules/mu/{clouds → providers}/cloudformation/server_pool.rb +5 -5
  127. data/modules/mu/{clouds → providers}/cloudformation/vpc.rb +3 -3
  128. data/modules/mu/{clouds → providers}/docker.rb +0 -0
  129. data/modules/mu/{clouds → providers}/google.rb +14 -6
  130. data/modules/mu/{clouds → providers}/google/bucket.rb +1 -1
  131. data/modules/mu/{clouds → providers}/google/container_cluster.rb +28 -13
  132. data/modules/mu/{clouds → providers}/google/database.rb +1 -8
  133. data/modules/mu/{clouds → providers}/google/firewall_rule.rb +2 -2
  134. data/modules/mu/{clouds → providers}/google/folder.rb +4 -8
  135. data/modules/mu/{clouds → providers}/google/function.rb +3 -3
  136. data/modules/mu/{clouds → providers}/google/group.rb +8 -16
  137. data/modules/mu/{clouds → providers}/google/habitat.rb +3 -7
  138. data/modules/mu/{clouds → providers}/google/loadbalancer.rb +1 -1
  139. data/modules/mu/{clouds → providers}/google/role.rb +42 -34
  140. data/modules/mu/{clouds → providers}/google/server.rb +25 -10
  141. data/modules/mu/{clouds → providers}/google/server_pool.rb +10 -10
  142. data/modules/mu/{clouds → providers}/google/user.rb +31 -21
  143. data/modules/mu/{clouds → providers}/google/userdata/README.md +0 -0
  144. data/modules/mu/{clouds → providers}/google/userdata/linux.erb +0 -0
  145. data/modules/mu/{clouds → providers}/google/userdata/windows.erb +0 -0
  146. data/modules/mu/{clouds → providers}/google/vpc.rb +37 -2
  147. data/modules/tests/centos6.yaml +11 -0
  148. data/modules/tests/centos7.yaml +11 -0
  149. data/modules/tests/centos8.yaml +12 -0
  150. data/modules/tests/rds.yaml +108 -0
  151. data/modules/tests/regrooms/rds.yaml +123 -0
  152. data/spec/mu/clouds/azure_spec.rb +2 -2
  153. metadata +108 -89
  154. data/modules/mu/clouds/aws/database.rb +0 -1974
@@ -345,7 +345,7 @@ module MU
345
345
  rescue Aws::Route53::Errors::LastVPCAssociation => e
346
346
  MU.log e.inspect, MU::WARN
347
347
  rescue Aws::Route53::Errors::VPCAssociationNotFound
348
- MU.log "VPC #{vpc_id} access to zone #{id} already revoked", MU::WARN
348
+ MU.log "VPC #{vpc_id} access to zone #{id} already revoked", MU::NOTICE
349
349
  end
350
350
  end
351
351
  end
@@ -825,10 +825,7 @@ module MU
825
825
  end
826
826
 
827
827
  if !record['mu_type'].nil?
828
- zone["dependencies"] << {
829
- "type" => record['mu_type'],
830
- "name" => record['target']
831
- }
828
+ MU::Config.addDependency(zone, record['target'], record['mu_type'])
832
829
  end
833
830
 
834
831
  if record.has_key?('healthchecks') && !record['healthchecks'].empty?
@@ -472,11 +472,7 @@ MU::Cloud::AWS.apig(region: @config['region'], credentials: @config['credentials
472
472
  endpoint['methods'].each { |m|
473
473
  if m['integrate_with'] and m['integrate_with']['name']
474
474
  if m['integrate_with']['type'] != "aws_generic"
475
- endpoint['dependencies'] ||= []
476
- endpoint['dependencies'] << {
477
- "type" => m['integrate_with']['type'],
478
- "name" => m['integrate_with']['name']
479
- }
475
+ MU::Config.addDependency(endpoint, m['integrate_with']['name'], m['integrate_with']['type'])
480
476
  end
481
477
 
482
478
  m['integrate_with']['backend_http_method'] ||= m['type']
@@ -525,13 +521,8 @@ MU::Cloud::AWS.apig(region: @config['region'], credentials: @config['credentials
525
521
  end
526
522
  configurator.insertKitten(roledesc, "roles")
527
523
 
528
- endpoint['dependencies'] ||= []
529
524
  m['iam_role'] = endpoint['name']+"-"+m['integrate_with']['name']
530
-
531
- endpoint['dependencies'] << {
532
- "type" => "role",
533
- "name" => endpoint['name']+"-"+m['integrate_with']['name']
534
- }
525
+ MU::Config.addDependency(endpoint, m['iam_role'], "role")
535
526
  end
536
527
  end
537
528
  }
@@ -18,7 +18,7 @@ module MU
18
18
  class AWS
19
19
  # A firewall ruleset as configured in {MU::Config::BasketofKittens::firewall_rules}
20
20
  class FirewallRule < MU::Cloud::FirewallRule
21
- require "mu/clouds/aws/vpc"
21
+ require "mu/providers/aws/vpc"
22
22
 
23
23
  @admin_sgs = Hash.new
24
24
  @admin_sg_semaphore = Mutex.new
@@ -398,7 +398,7 @@ module MU
398
398
 
399
399
  # Some services create sneaky rogue ENIs which then block removal of
400
400
  # associated security groups. Find them and fry them.
401
- MU::Cloud::AWS::VPC.purge_interfaces(noop, filters, region: region, credentials: credentials)
401
+ MU::Cloud.resourceClass("AWS", "VPC").purge_interfaces(noop, filters, region: region, credentials: credentials)
402
402
 
403
403
  resp = MU::Cloud::AWS.ec2(credentials: credentials, region: region).describe_security_groups(
404
404
  filters: filters
@@ -421,7 +421,7 @@ module MU
421
421
  # try to get out from under loose network interfaces with which
422
422
  # we're associated
423
423
  if sg.vpc_id
424
- default_sg = MU::Cloud::AWS::VPC.getDefaultSg(sg.vpc_id, region: region, credentials: credentials)
424
+ default_sg = MU::Cloud.resourceClass("AWS", "VPC").getDefaultSg(sg.vpc_id, region: region, credentials: credentials)
425
425
  if default_sg
426
426
  eni_resp = MU::Cloud::AWS.ec2(credentials: credentials, region: region).describe_network_interfaces(
427
427
  filters: [ {name: "group-id", values: [sg.group_id]} ]
@@ -514,6 +514,31 @@ module MU
514
514
  end
515
515
  private_class_method :revoke_rules
516
516
 
517
+ # Return an AWS-specific chunk of schema commonly used in the +ingress_rules+ parameter of other resource types.
518
+ # @return [Hash]
519
+ def self.ingressRuleAddtlSchema
520
+ {
521
+ "items" => {
522
+ "properties" => {
523
+ "sgs" => {
524
+ "type" => "array",
525
+ "items" => {
526
+ "description" => "Other AWS Security Groups; resources that are associated with this group will have this rule applied to their traffic",
527
+ "type" => "string"
528
+ }
529
+ },
530
+ "lbs" => {
531
+ "type" => "array",
532
+ "items" => {
533
+ "description" => "AWS Load Balancers which will have this rule applied to their traffic",
534
+ "type" => "string"
535
+ }
536
+ }
537
+ }
538
+ }
539
+ }
540
+ end
541
+
517
542
  # Cloud-specific configuration properties.
518
543
  # @param _config [MU::Config]: The calling MU::Config object
519
544
  # @return [Array<Array,Hash>]: List of required fields, and json-schema Hash of cloud-specific configuration parameters for this resource
@@ -623,36 +648,16 @@ module MU
623
648
 
624
649
  if rule['firewall_rules']
625
650
  rule['firewall_rules'].each { |sg|
626
- if sg.is_a?(MU::Config::Ref) and sg.name
627
- acl["dependencies"] << {
628
- "type" => "firewall_rule",
629
- "name" => sg.name,
630
- "no_create_wait" => true
631
- }
632
- elsif sg['name'] and !sg['deploy_id']
633
- acl["dependencies"] << {
634
- "type" => "firewall_rule",
635
- "name" => sg['name'],
636
- "no_create_wait" => true
637
- }
651
+ if sg['name'] and !sg['deploy_id']
652
+ MU::Config.addDependency(acl, sg['name'], "firewall_rule", no_create_wait: true)
638
653
  end
639
654
  }
640
655
  end
641
656
 
642
657
  if rule['loadbalancers']
643
658
  rule['loadbalancers'].each { |lb|
644
- if lb.is_a?(MU::Config::Ref) and lb.name
645
- acl["dependencies"] << {
646
- "type" => "loadbalancer",
647
- "name" => lb.name,
648
- "phase" => "groom"
649
- }
650
- elsif lb['name'] and !lb['deploy_id']
651
- acl["dependencies"] << {
652
- "type" => "loadbalancer",
653
- "name" => lb['name'],
654
- "phase" => "groom"
655
- }
659
+ if lb['name'] and !lb['deploy_id']
660
+ MU::Config.addDependency(acl, lb['name'], "loadbalancer", phase: "groom")
656
661
  end
657
662
  }
658
663
  end
@@ -739,7 +744,6 @@ module MU
739
744
  # "ingress_rules" structure parsed and validated by MU::Config.
740
745
  #########################################################################
741
746
  def setRules(rules, add_to_self: false, ingress: true, egress: false)
742
- describe
743
747
  # XXX warn about attempt to set rules before we exist
744
748
  return if rules.nil? or rules.size == 0 or !@cloud_id
745
749
 
@@ -760,7 +764,7 @@ module MU
760
764
  ec2_rules = convertToEc2(rules)
761
765
  return if ec2_rules.nil?
762
766
 
763
- ext_permissions = MU.structToHash(cloud_desc.ip_permissions)
767
+ ext_permissions = MU.structToHash(cloud_desc(use_cache: false).ip_permissions)
764
768
 
765
769
  purge_extraneous_rules(ec2_rules, ext_permissions)
766
770
 
@@ -505,11 +505,7 @@ MU.log shortname, MU::NOTICE, details: function.configuration.role
505
505
  function["add_firewall_rules"] << {"name" => fwname}
506
506
  function["permissions"] ||= []
507
507
  function["permissions"] << "network"
508
- function['dependencies'] ||= []
509
- function['dependencies'] << {
510
- "name" => fwname,
511
- "type" => "firewall_rule"
512
- }
508
+ MU::Config.addDependency(function, fwname, "firewall_rule")
513
509
  end
514
510
 
515
511
  if !function['iam_role']
@@ -541,13 +537,9 @@ MU.log shortname, MU::NOTICE, details: function.configuration.role
541
537
  }
542
538
  configurator.insertKitten(roledesc, "roles")
543
539
 
544
- function['dependencies'] ||= []
545
540
  function['iam_role'] = function['name']+"execrole"
546
541
 
547
- function['dependencies'] << {
548
- "type" => "role",
549
- "name" => function['name']+"execrole"
550
- }
542
+ MU::Config.addDependency(function, function['name']+"execrole", "role")
551
543
  end
552
544
 
553
545
  ok
@@ -60,7 +60,7 @@ module MU
60
60
  userid = user
61
61
  userdesc = @deploy.findLitterMate(name: user, type: "users")
62
62
  userid = userdesc.cloud_id if userdesc
63
- found = MU::Cloud::AWS::User.find(cloud_id: userid)
63
+ found = MU::Cloud.resourceClass("AWS", "User").find(cloud_id: userid)
64
64
  if found.size == 1
65
65
  userdesc = found.values.first
66
66
  MU.log "Adding IAM user #{userdesc.path}#{userdesc.user_name} to group #{@mu_name}", MU::NOTICE
@@ -88,7 +88,7 @@ module MU
88
88
  # Create these if necessary, then append them to the list of
89
89
  # attachable_policies
90
90
  if @config['raw_policies']
91
- pol_arns = MU::Cloud::AWS::Role.manageRawPolicies(
91
+ pol_arns = MU::Cloud.resourceClass("AWS", "Role").manageRawPolicies(
92
92
  @config['raw_policies'],
93
93
  basename: @deploy.getResourceName(@config['name']),
94
94
  credentials: @credentials
@@ -114,7 +114,7 @@ module MU
114
114
  attached_policies.each { |a|
115
115
  if !configured_policies.include?(a.policy_arn)
116
116
  MU.log "Removing IAM policy #{a.policy_arn} from group #{@mu_name}", MU::NOTICE
117
- MU::Cloud::AWS::Role.purgePolicy(a.policy_arn, @credentials)
117
+ MU::Cloud.resourceClass("AWS", "Role").purgePolicy(a.policy_arn, @credentials)
118
118
  else
119
119
  configured_policies.delete(a.policy_arn)
120
120
  end
@@ -131,7 +131,7 @@ module MU
131
131
  end
132
132
 
133
133
  if @config['inline_policies']
134
- docs = MU::Cloud::AWS::Role.genPolicyDocument(@config['inline_policies'], deploy_obj: @deploy)
134
+ docs = MU::Cloud.resourceClass("AWS", "Role").genPolicyDocument(@config['inline_policies'], deploy_obj: @deploy)
135
135
  docs.each { |doc|
136
136
  MU.log "Putting user policy #{doc.keys.first} to group #{@cloud_id} "
137
137
  MU::Cloud::AWS.iam(credentials: @credentials).put_group_policy(
@@ -291,7 +291,7 @@ module MU
291
291
  resp.policy_names.each { |pol_name|
292
292
  pol = MU::Cloud::AWS.iam(credentials: @credentials).get_group_policy(group_name: @cloud_id, policy_name: pol_name)
293
293
  doc = JSON.parse(URI.decode(pol.policy_document))
294
- bok["inline_policies"] = MU::Cloud::AWS::Role.doc2MuPolicies(pol.policy_name, doc, bok["inline_policies"])
294
+ bok["inline_policies"] = MU::Cloud.resourceClass("AWS", "Role").doc2MuPolicies(pol.policy_name, doc, bok["inline_policies"])
295
295
  }
296
296
  end
297
297
 
@@ -324,7 +324,7 @@ module MU
324
324
  def self.schema(_config)
325
325
  toplevel_required = []
326
326
  polschema = MU::Config::Role.schema["properties"]["policies"]
327
- polschema.deep_merge!(MU::Cloud::AWS::Role.condition_schema)
327
+ polschema.deep_merge!(MU::Cloud.resourceClass("AWS", "Role").condition_schema)
328
328
 
329
329
  schema = {
330
330
  "inline_policies" => polschema,
@@ -364,7 +364,7 @@ style long name, like +IAMTESTS-DEV-2018112815-IS-GROUP-FOO+. This parameter wil
364
364
  # If we're attaching some managed policies, make sure all of the ones
365
365
  # that should already exist do indeed exist
366
366
  if group['attachable_policies']
367
- ok = false if !MU::Cloud::AWS::Role.validateAttachablePolicies(
367
+ ok = false if !MU::Cloud.resourceClass("AWS", "Role").validateAttachablePolicies(
368
368
  group['attachable_policies'],
369
369
  credentials: group['credentials'],
370
370
  region: group['region']
@@ -378,13 +378,9 @@ style long name, like +IAMTESTS-DEV-2018112815-IS-GROUP-FOO+. This parameter wil
378
378
  if group['members']
379
379
  group['members'].each { |user|
380
380
  if configurator.haveLitterMate?(user, "users")
381
- group["dependencies"] ||= []
382
- group["dependencies"] << {
383
- "type" => "user",
384
- "name" => user
385
- }
381
+ MU::Config.addDependency(group, user, "user")
386
382
  else
387
- found = MU::Cloud::AWS::User.find(cloud_id: user)
383
+ found = MU::Cloud.resourceClass("AWS", "User").find(cloud_id: user)
388
384
  if found.nil? or found.empty?
389
385
  MU.log "Error in members for group #{group['name']}: No such user #{user}", MU::ERR
390
386
  ok = false
@@ -144,7 +144,7 @@ module MU
144
144
  def self.orgMasterCreds?(credentials = nil)
145
145
  acct_num = MU::Cloud::AWS.iam(credentials: credentials).list_users.users.first.arn.split(/:/)[4]
146
146
 
147
- parentorg = MU::Cloud::AWS::Folder.find(credentials: credentials).values.first
147
+ parentorg = MU::Cloud.resourceClass("AWS", "Folder").find(credentials: credentials).values.first
148
148
  acct_num == parentorg.master_account_id
149
149
  end
150
150
 
@@ -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
  }
@@ -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
 
@@ -706,7 +732,7 @@ module MU
706
732
  end
707
733
  if matched
708
734
  if !MU::Cloud::AWS.isGovCloud?
709
- MU::Cloud::AWS::DNSZone.genericMuDNSEntry(name: lb.load_balancer_name, target: lb.dns_name, cloudclass: MU::Cloud::LoadBalancer, delete: true) if !noop
735
+ MU::Cloud.resourceClass("AWS", "DNSZone").genericMuDNSEntry(name: lb.load_balancer_name, target: lb.dns_name, cloudclass: MU::Cloud::LoadBalancer, delete: true) if !noop
710
736
  end
711
737
  if classic
712
738
  MU.log "Removing Elastic Load Balancer #{lb.load_balancer_name}"
@@ -793,26 +819,7 @@ module MU
793
819
  }
794
820
  }
795
821
  },
796
- "ingress_rules" => {
797
- "items" => {
798
- "properties" => {
799
- "sgs" => {
800
- "type" => "array",
801
- "items" => {
802
- "description" => "Other AWS Security Groups; resources that are associated with this group will have this rule applied to their traffic",
803
- "type" => "string"
804
- }
805
- },
806
- "lbs" => {
807
- "type" => "array",
808
- "items" => {
809
- "description" => "AWS Load Balancers which will have this rule applied to their traffic",
810
- "type" => "string"
811
- }
812
- }
813
- }
814
- }
815
- }
822
+ "ingress_rules" => MU::Cloud.resourceClass("AWS", "FirewallRule").ingressRuleAddtlSchema
816
823
  }
817
824
  [toplevel_required, schema]
818
825
  end
@@ -923,6 +930,7 @@ module MU
923
930
  return matches
924
931
 
925
932
  end
933
+
926
934
  end
927
935
  end
928
936
  end
@@ -233,8 +233,8 @@ module MU
233
233
  # unless noop
234
234
  # MU::Cloud::AWS.iam(credentials: credentials).list_roles.roles.each{ |role|
235
235
  # match_string = "#{MU.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::AWS::Server.
237
- # MU::Cloud::AWS::Server.removeIAMProfile(role.role_name) if role.role_name.match(match_string)
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
238
  # }
239
239
  # end
240
240
  end
@@ -327,16 +327,10 @@ module MU
327
327
  failq.delete("failqueue")
328
328
  ok = false if !configurator.insertKitten(failq, "msg_queues")
329
329
  queue['failqueue']['name'] = failq['name']
330
- queue['dependencies'] << {
331
- "name" => failq['name'],
332
- "type" => "msg_queue"
333
- }
330
+ MU::Config.addDependency(queue, failq["name"], "msg_queue")
334
331
  else
335
332
  if configurator.haveLitterMate?(queue['failqueue']['name'], "msg_queue")
336
- queue['dependencies'] << {
337
- "name" => queue['failqueue']['name'],
338
- "type" => "msg_queue"
339
- }
333
+ MU::Config.addDependency(queue, queue['failqueue']['name'], "msg_queue")
340
334
  else
341
335
  failq = MU::Cloud::AWS::MsgQueue.find(cloud_id: queue['failqueue']['name'])
342
336
  if !failq
@@ -615,7 +615,6 @@ end
615
615
  )
616
616
  JSON.parse(URI.decode(version.policy_version.document))
617
617
  end
618
-
619
618
  bok["policies"] = MU::Cloud::AWS::Role.doc2MuPolicies(pol.policy_name, doc, bok["policies"])
620
619
  end
621
620
  }
@@ -695,6 +694,7 @@ end
695
694
  end
696
695
 
697
696
  bok["attachable_policies"].uniq! if bok["attachable_policies"]
697
+ bok["name"].gsub!(/[^a-zA-Z0-9_\-]/, "_")
698
698
 
699
699
  bok
700
700
  end
@@ -707,6 +707,10 @@ end
707
707
  def self.doc2MuPolicies(basename, doc, policies = [])
708
708
  policies ||= []
709
709
 
710
+ if !doc["Statement"].is_a?(Array)
711
+ doc["Statement"] = [doc["Statement"]]
712
+ end
713
+
710
714
  doc["Statement"].each { |s|
711
715
  if !s["Action"]
712
716
  MU.log "Statement in policy document for #{basename} didn't have an Action field", MU::WARN, details: doc
@@ -925,7 +929,7 @@ end
925
929
  toplevel_required = []
926
930
  aws_resource_types = MU::Cloud.resource_types.keys.reject { |t|
927
931
  begin
928
- MU::Cloud.loadCloudType("AWS", t)
932
+ MU::Cloud.resourceClass("AWS", t)
929
933
  false
930
934
  rescue MuCloudResourceNotImplemented
931
935
  true
@@ -1087,11 +1091,7 @@ end
1087
1091
  role['policies'].each { |policy|
1088
1092
  policy['targets'].each { |target|
1089
1093
  if target['type']
1090
- role['dependencies'] ||= []
1091
- role['dependencies'] << {
1092
- "name" => target['identifier'],
1093
- "type" => target['type']
1094
- }
1094
+ MU::Config.addDependency(role, target['identifier'], target['type'])
1095
1095
  end
1096
1096
  }
1097
1097
  }