cloud-mu 3.2.0 → 3.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (156) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +1 -1
  3. data/ansible/roles/mu-nat/tasks/main.yml +3 -0
  4. data/bin/mu-adopt +12 -1
  5. data/bin/mu-aws-setup +41 -7
  6. data/bin/mu-azure-setup +34 -0
  7. data/bin/mu-configure +214 -119
  8. data/bin/mu-gcp-setup +37 -2
  9. data/bin/mu-load-config.rb +2 -1
  10. data/bin/mu-node-manage +3 -0
  11. data/bin/mu-refresh-ssl +67 -0
  12. data/bin/mu-run-tests +28 -6
  13. data/bin/mu-self-update +30 -10
  14. data/bin/mu-upload-chef-artifacts +30 -26
  15. data/cloud-mu.gemspec +10 -8
  16. data/cookbooks/mu-master/attributes/default.rb +5 -1
  17. data/cookbooks/mu-master/metadata.rb +2 -2
  18. data/cookbooks/mu-master/recipes/default.rb +81 -26
  19. data/cookbooks/mu-master/recipes/init.rb +197 -62
  20. data/cookbooks/mu-master/recipes/update_nagios_only.rb +1 -1
  21. data/cookbooks/mu-master/recipes/vault.rb +78 -77
  22. data/cookbooks/mu-master/templates/default/mods/rewrite.conf.erb +1 -0
  23. data/cookbooks/mu-master/templates/default/nagios.conf.erb +103 -0
  24. data/cookbooks/mu-master/templates/default/web_app.conf.erb +14 -30
  25. data/cookbooks/mu-tools/attributes/default.rb +12 -0
  26. data/cookbooks/mu-tools/files/centos-6/CentOS-Base.repo +47 -0
  27. data/cookbooks/mu-tools/libraries/helper.rb +98 -4
  28. data/cookbooks/mu-tools/libraries/monkey.rb +1 -1
  29. data/cookbooks/mu-tools/recipes/apply_security.rb +31 -9
  30. data/cookbooks/mu-tools/recipes/aws_api.rb +8 -2
  31. data/cookbooks/mu-tools/recipes/base_repositories.rb +1 -1
  32. data/cookbooks/mu-tools/recipes/gcloud.rb +2 -9
  33. data/cookbooks/mu-tools/recipes/google_api.rb +7 -0
  34. data/cookbooks/mu-tools/recipes/rsyslog.rb +8 -1
  35. data/cookbooks/mu-tools/resources/disk.rb +113 -42
  36. data/cookbooks/mu-tools/resources/mommacat_request.rb +1 -2
  37. data/cookbooks/mu-tools/templates/centos-8/sshd_config.erb +215 -0
  38. data/extras/Gemfile.lock.bootstrap +394 -0
  39. data/extras/bucketstubs/error.html +0 -0
  40. data/extras/bucketstubs/index.html +0 -0
  41. data/extras/clean-stock-amis +11 -3
  42. data/extras/generate-stock-images +6 -3
  43. data/extras/git_rpm/build.sh +20 -0
  44. data/extras/git_rpm/mugit.spec +53 -0
  45. data/extras/image-generators/AWS/centos7.yaml +19 -16
  46. data/extras/image-generators/AWS/{rhel7.yaml → rhel71.yaml} +0 -0
  47. data/extras/image-generators/AWS/{win2k12.yaml → win2k12r2.yaml} +0 -0
  48. data/extras/image-generators/VMWare/centos8.yaml +15 -0
  49. data/extras/openssl_rpm/build.sh +19 -0
  50. data/extras/openssl_rpm/mussl.spec +46 -0
  51. data/extras/python_rpm/muthon.spec +14 -4
  52. data/extras/ruby_rpm/muby.spec +9 -5
  53. data/extras/sqlite_rpm/build.sh +19 -0
  54. data/extras/sqlite_rpm/muqlite.spec +47 -0
  55. data/install/installer +7 -5
  56. data/modules/mommacat.ru +2 -2
  57. data/modules/mu.rb +14 -7
  58. data/modules/mu/adoption.rb +5 -5
  59. data/modules/mu/cleanup.rb +47 -25
  60. data/modules/mu/cloud.rb +29 -1
  61. data/modules/mu/cloud/dnszone.rb +0 -2
  62. data/modules/mu/cloud/machine_images.rb +1 -1
  63. data/modules/mu/cloud/providers.rb +6 -1
  64. data/modules/mu/cloud/resource_base.rb +16 -7
  65. data/modules/mu/cloud/ssh_sessions.rb +5 -1
  66. data/modules/mu/cloud/wrappers.rb +20 -7
  67. data/modules/mu/config.rb +28 -12
  68. data/modules/mu/config/bucket.rb +31 -2
  69. data/modules/mu/config/cache_cluster.rb +1 -1
  70. data/modules/mu/config/cdn.rb +100 -0
  71. data/modules/mu/config/container_cluster.rb +1 -1
  72. data/modules/mu/config/database.rb +3 -3
  73. data/modules/mu/config/dnszone.rb +4 -3
  74. data/modules/mu/config/endpoint.rb +1 -0
  75. data/modules/mu/config/firewall_rule.rb +1 -1
  76. data/modules/mu/config/function.rb +16 -7
  77. data/modules/mu/config/job.rb +89 -0
  78. data/modules/mu/config/notifier.rb +7 -18
  79. data/modules/mu/config/ref.rb +55 -9
  80. data/modules/mu/config/schema_helpers.rb +12 -3
  81. data/modules/mu/config/server.rb +11 -5
  82. data/modules/mu/config/server_pool.rb +2 -2
  83. data/modules/mu/config/vpc.rb +11 -10
  84. data/modules/mu/defaults/AWS.yaml +106 -106
  85. data/modules/mu/deploy.rb +40 -14
  86. data/modules/mu/groomers/chef.rb +2 -2
  87. data/modules/mu/master.rb +70 -3
  88. data/modules/mu/mommacat.rb +28 -9
  89. data/modules/mu/mommacat/daemon.rb +13 -7
  90. data/modules/mu/mommacat/naming.rb +2 -2
  91. data/modules/mu/mommacat/search.rb +16 -5
  92. data/modules/mu/mommacat/storage.rb +67 -32
  93. data/modules/mu/providers/aws.rb +298 -85
  94. data/modules/mu/providers/aws/alarm.rb +5 -5
  95. data/modules/mu/providers/aws/bucket.rb +284 -50
  96. data/modules/mu/providers/aws/cache_cluster.rb +26 -26
  97. data/modules/mu/providers/aws/cdn.rb +782 -0
  98. data/modules/mu/providers/aws/collection.rb +16 -16
  99. data/modules/mu/providers/aws/container_cluster.rb +84 -64
  100. data/modules/mu/providers/aws/database.rb +59 -55
  101. data/modules/mu/providers/aws/dnszone.rb +29 -12
  102. data/modules/mu/providers/aws/endpoint.rb +535 -50
  103. data/modules/mu/providers/aws/firewall_rule.rb +32 -26
  104. data/modules/mu/providers/aws/folder.rb +1 -1
  105. data/modules/mu/providers/aws/function.rb +300 -134
  106. data/modules/mu/providers/aws/group.rb +16 -14
  107. data/modules/mu/providers/aws/habitat.rb +4 -4
  108. data/modules/mu/providers/aws/job.rb +469 -0
  109. data/modules/mu/providers/aws/loadbalancer.rb +67 -45
  110. data/modules/mu/providers/aws/log.rb +17 -17
  111. data/modules/mu/providers/aws/msg_queue.rb +22 -13
  112. data/modules/mu/providers/aws/nosqldb.rb +99 -8
  113. data/modules/mu/providers/aws/notifier.rb +137 -65
  114. data/modules/mu/providers/aws/role.rb +119 -83
  115. data/modules/mu/providers/aws/search_domain.rb +166 -30
  116. data/modules/mu/providers/aws/server.rb +209 -118
  117. data/modules/mu/providers/aws/server_pool.rb +95 -130
  118. data/modules/mu/providers/aws/storage_pool.rb +19 -11
  119. data/modules/mu/providers/aws/user.rb +5 -5
  120. data/modules/mu/providers/aws/userdata/linux.erb +5 -4
  121. data/modules/mu/providers/aws/vpc.rb +109 -54
  122. data/modules/mu/providers/aws/vpc_subnet.rb +43 -39
  123. data/modules/mu/providers/azure.rb +78 -12
  124. data/modules/mu/providers/azure/server.rb +20 -4
  125. data/modules/mu/providers/cloudformation/server.rb +1 -1
  126. data/modules/mu/providers/google.rb +21 -5
  127. data/modules/mu/providers/google/bucket.rb +1 -1
  128. data/modules/mu/providers/google/container_cluster.rb +1 -1
  129. data/modules/mu/providers/google/database.rb +1 -1
  130. data/modules/mu/providers/google/firewall_rule.rb +1 -1
  131. data/modules/mu/providers/google/folder.rb +7 -3
  132. data/modules/mu/providers/google/function.rb +66 -31
  133. data/modules/mu/providers/google/group.rb +1 -1
  134. data/modules/mu/providers/google/habitat.rb +1 -1
  135. data/modules/mu/providers/google/loadbalancer.rb +1 -1
  136. data/modules/mu/providers/google/role.rb +6 -3
  137. data/modules/mu/providers/google/server.rb +1 -1
  138. data/modules/mu/providers/google/server_pool.rb +1 -1
  139. data/modules/mu/providers/google/user.rb +1 -1
  140. data/modules/mu/providers/google/vpc.rb +28 -3
  141. data/modules/tests/aws-jobs-functions.yaml +46 -0
  142. data/modules/tests/aws-servers-with-handrolled-iam.yaml +37 -0
  143. data/modules/tests/centos6.yaml +4 -0
  144. data/modules/tests/centos7.yaml +4 -0
  145. data/modules/tests/ecs.yaml +2 -2
  146. data/modules/tests/eks.yaml +1 -1
  147. data/modules/tests/functions/node-function/lambda_function.js +10 -0
  148. data/modules/tests/functions/python-function/lambda_function.py +12 -0
  149. data/modules/tests/k8s.yaml +1 -1
  150. data/modules/tests/microservice_app.yaml +288 -0
  151. data/modules/tests/rds.yaml +5 -5
  152. data/modules/tests/regrooms/rds.yaml +5 -5
  153. data/modules/tests/server-with-scrub-muisms.yaml +1 -1
  154. data/modules/tests/super_complex_bok.yml +2 -2
  155. data/modules/tests/super_simple_bok.yml +2 -2
  156. metadata +42 -17
@@ -224,7 +224,7 @@ module MU
224
224
  }
225
225
 
226
226
  modify_db_cluster_struct[:preferred_maintenance_window] = @config["preferred_maintenance_window"] if @config["preferred_maintenance_window"]
227
- MU::Cloud::AWS.rds(region: @config['region'], credentials: @config['credentials']).modify_db_cluster(modify_db_cluster_struct)
227
+ MU::Cloud::AWS.rds(region: @region, credentials: @credentials).modify_db_cluster(modify_db_cluster_struct)
228
228
  wait_until_available
229
229
  end
230
230
 
@@ -305,7 +305,7 @@ module MU
305
305
  def toKitten(**_args)
306
306
  bok = {
307
307
  "cloud" => "AWS",
308
- "region" => @config['region'],
308
+ "region" => @region,
309
309
  "credentials" => @credentials,
310
310
  "cloud_id" => @cloud_id,
311
311
  }
@@ -317,8 +317,8 @@ module MU
317
317
  end
318
318
 
319
319
  noun = @config["create_cluster"] ? "cluster" : "db"
320
- tags = MU::Cloud::AWS.rds(credentials: @credentials, region: @config['region']).list_tags_for_resource(
321
- resource_name: MU::Cloud::AWS::Database.getARN(@cloud_id, noun, "rds", region: @config['region'], credentials: @credentials)
320
+ tags = MU::Cloud::AWS.rds(credentials: @credentials, region: @region).list_tags_for_resource(
321
+ resource_name: MU::Cloud::AWS::Database.getARN(@cloud_id, noun, "rds", region: @region, credentials: @credentials)
322
322
  ).tag_list
323
323
  if tags and !tags.empty?
324
324
  bok['tags'] = MU.structToHash(tags, stringify_keys: true)
@@ -332,11 +332,11 @@ module MU
332
332
  bok["create_cluster"] = true if @config['create_cluster']
333
333
 
334
334
  params = if bok['create_cluster']
335
- MU::Cloud::AWS.rds(credentials: @credentials, region: @config['region']).describe_db_cluster_parameters(
335
+ MU::Cloud::AWS.rds(credentials: @credentials, region: @region).describe_db_cluster_parameters(
336
336
  db_cluster_parameter_group_name: cloud_desc.db_cluster_parameter_group
337
337
  ).parameters
338
338
  else
339
- MU::Cloud::AWS.rds(credentials: @credentials, region: @config['region']).describe_db_parameters(
339
+ MU::Cloud::AWS.rds(credentials: @credentials, region: @region).describe_db_parameters(
340
340
  db_parameter_group_name: cloud_desc.db_parameter_groups.first.db_parameter_group_name
341
341
  ).parameters
342
342
  end
@@ -353,7 +353,7 @@ module MU
353
353
  id: sg.vpc_security_group_id,
354
354
  cloud: "AWS",
355
355
  credentials: @credentials,
356
- region: @config['region'],
356
+ region: @region,
357
357
  type: "firewall_rules",
358
358
  )
359
359
  }
@@ -373,7 +373,7 @@ module MU
373
373
  # we have no sensible way to handle heterogenous cluster members, so
374
374
  # for now just assume they're all the same
375
375
  cloud_desc.db_cluster_members.each { |db|
376
- member = MU::Cloud::AWS::Database.find(cloud_id: db.db_instance_identifier, region: @config['region'], credentials: @credentials).values.first
376
+ member = MU::Cloud::AWS::Database.find(cloud_id: db.db_instance_identifier, region: @region, credentials: @credentials).values.first
377
377
 
378
378
  sizes << member.db_instance_class
379
379
  if member.db_subnet_group and member.db_subnet_group.vpc_id
@@ -385,14 +385,14 @@ module MU
385
385
  vpcs.uniq!
386
386
  bok['size'] = sizes.sort.first if !sizes.empty?
387
387
  if !vpcs.empty?
388
- myvpc = MU::MommaCat.findStray("AWS", "vpc", cloud_id: vpcs.sort.first.vpc_id, credentials: @credentials, region: @config['region'], dummy_ok: true, no_deploy_search: true).first
388
+ myvpc = MU::MommaCat.findStray("AWS", "vpc", cloud_id: vpcs.sort.first.vpc_id, credentials: @credentials, region: @region, dummy_ok: true, no_deploy_search: true).first
389
389
  bok['vpc'] = myvpc.getReference(vpcs.sort.first.subnets.map { |s| s.subnet_identifier })
390
390
  end
391
391
  else
392
392
  bok['size'] = cloud_desc.db_instance_class
393
393
  bok['auto_minor_version_upgrade'] = true if cloud_desc.auto_minor_version_upgrade
394
394
  if cloud_desc.db_subnet_group
395
- myvpc = MU::MommaCat.findStray("AWS", "vpc", cloud_id: cloud_desc.db_subnet_group.vpc_id, credentials: @credentials, region: @config['region'], dummy_ok: true, no_deploy_search: true).first
395
+ myvpc = MU::MommaCat.findStray("AWS", "vpc", cloud_id: cloud_desc.db_subnet_group.vpc_id, credentials: @credentials, region: @region, dummy_ok: true, no_deploy_search: true).first
396
396
  bok['vpc'] = myvpc.getReference(cloud_desc.db_subnet_group.subnets.map { |s| s.subnet_identifier })
397
397
  end
398
398
  bok['storage_type'] = cloud_desc.storage_type
@@ -467,13 +467,13 @@ dependencies
467
467
  raise MuError, "Couldn't find subnets in #{@vpc} to add to #{@config["subnet_group_name"]}. Make sure the subnets are valid and publicly_accessible is set correctly"
468
468
  else
469
469
  resp = begin
470
- MU::Cloud::AWS.rds(region: @config['region'], credentials: @config['credentials']).describe_db_subnet_groups(
470
+ MU::Cloud::AWS.rds(region: @region, credentials: @credentials).describe_db_subnet_groups(
471
471
  db_subnet_group_name: @config["subnet_group_name"]
472
472
  )
473
473
  # XXX ensure subnet group matches our config?
474
474
  rescue ::Aws::RDS::Errors::DBSubnetGroupNotFoundFault
475
475
  # Create subnet group
476
- resp = MU::Cloud::AWS.rds(region: @config['region'], credentials: @config['credentials']).create_db_subnet_group(
476
+ resp = MU::Cloud::AWS.rds(region: @region, credentials: @credentials).create_db_subnet_group(
477
477
  db_subnet_group_name: @config["subnet_group_name"],
478
478
  db_subnet_group_description: @config["subnet_group_name"],
479
479
  subnet_ids: subnet_ids,
@@ -511,13 +511,13 @@ dependencies
511
511
  if create
512
512
  MU.log "Creating a #{cluster ? "cluster" : "database" } parameter group #{@config["parameter_group_name"]}"
513
513
 
514
- MU::Cloud::AWS.rds(region: @config['region'], credentials: @config['credentials']).send(cluster ? :create_db_cluster_parameter_group : :create_db_parameter_group, params)
514
+ MU::Cloud::AWS.rds(region: @region, credentials: @credentials).send(cluster ? :create_db_cluster_parameter_group : :create_db_parameter_group, params)
515
515
  end
516
516
 
517
517
 
518
518
  if @config[fieldname] and !@config[fieldname].empty?
519
519
 
520
- old_values = MU::Cloud::AWS.rds(credentials: @credentials, region: @config['region']).send(cluster ? :describe_db_cluster_parameters : :describe_db_parameters, { name_param => @config["parameter_group_name"] } ).parameters
520
+ old_values = MU::Cloud::AWS.rds(credentials: @credentials, region: @region).send(cluster ? :describe_db_cluster_parameters : :describe_db_parameters, { name_param => @config["parameter_group_name"] } ).parameters
521
521
  old_values.map! { |p| [p.parameter_name, p.parameter_value] }.flatten
522
522
  old_values = old_values.to_h
523
523
 
@@ -532,12 +532,12 @@ dependencies
532
532
 
533
533
  MU.retrier([Aws::RDS::Errors::InvalidDBParameterGroupState], wait: 30, max: 10) {
534
534
  if cluster
535
- MU::Cloud::AWS.rds(region: @config['region'], credentials: @config['credentials']).modify_db_cluster_parameter_group(
535
+ MU::Cloud::AWS.rds(region: @region, credentials: @credentials).modify_db_cluster_parameter_group(
536
536
  db_cluster_parameter_group_name: @config["parameter_group_name"],
537
537
  parameters: params
538
538
  )
539
539
  else
540
- MU::Cloud::AWS.rds(region: @config['region'], credentials: @config['credentials']).modify_db_parameter_group(
540
+ MU::Cloud::AWS.rds(region: @region, credentials: @credentials).modify_db_parameter_group(
541
541
  db_parameter_group_name: @config["parameter_group_name"],
542
542
  parameters: params
543
543
  )
@@ -586,7 +586,7 @@ dependencies
586
586
  if @config["create_cluster"]
587
587
  @config['cluster_node_count'] ||= 1
588
588
  if @config['cluster_mode'] == "serverless"
589
- MU::Cloud::AWS.rds(region: @config['region'], credentials: @config['credentials']).modify_current_db_cluster_capacity(
589
+ MU::Cloud::AWS.rds(region: @region, credentials: @credentials).modify_current_db_cluster_capacity(
590
590
  db_cluster_identifier: @cloud_id,
591
591
  capacity: @config['cluster_node_count']
592
592
  )
@@ -612,8 +612,9 @@ dependencies
612
612
  if mods.size > 1
613
613
  MU.log "Modifying RDS instance #{@cloud_id}", MU::NOTICE, details: mods
614
614
  mods[:apply_immediately] = true
615
+ mods[:allow_major_version_upgrade] = true
615
616
  wait_until_available
616
- MU::Cloud::AWS.rds(region: @config['region'], credentials: @credentials).send("modify_db_#{noun}".to_sym, mods)
617
+ MU::Cloud::AWS.rds(region: @region, credentials: @credentials).send("modify_db_#{noun}".to_sym, mods)
617
618
  wait_until_available
618
619
  end
619
620
 
@@ -660,7 +661,7 @@ dependencies
660
661
  if !cloud_desc.db_security_groups.empty?
661
662
  cloud_desc.db_security_groups.each { |rds_sg|
662
663
  begin
663
- MU::Cloud::AWS.rds(region: @config['region'], credentials: @config['credentials']).authorize_db_security_group_ingress(
664
+ MU::Cloud::AWS.rds(region: @region, credentials: @credentials).authorize_db_security_group_ingress(
664
665
  db_security_group_name: rds_sg.db_security_group_name,
665
666
  cidrip: cidr
666
667
  )
@@ -680,9 +681,9 @@ dependencies
680
681
  # Return the metadata for this ContainerCluster
681
682
  # @return [Hash]
682
683
  def notify
683
- deploy_struct = MU.structToHash(cloud_desc)
684
+ deploy_struct = MU.structToHash(cloud_desc, stringify_keys: true)
684
685
  deploy_struct['cloud_id'] = @cloud_id
685
- deploy_struct["region"] ||= @config['region']
686
+ deploy_struct["region"] ||= @region
686
687
  deploy_struct["db_name"] ||= @config['db_name']
687
688
  deploy_struct
688
689
  end
@@ -708,14 +709,14 @@ dependencies
708
709
  end
709
710
 
710
711
  MU.retrier([Aws::RDS::Errors::InvalidDBInstanceState, Aws::RDS::Errors::InvalidDBClusterStateFault], wait: 60, max: 10) {
711
- MU::Cloud::AWS.rds(region: @config['region'], credentials: @config['credentials']).send("create_db_#{@config['create_cluster'] ? "cluster_" : ""}snapshot".to_sym, params)
712
+ MU::Cloud::AWS.rds(region: @region, credentials: @credentials).send("create_db_#{@config['create_cluster'] ? "cluster_" : ""}snapshot".to_sym, params)
712
713
  }
713
714
 
714
715
  loop_if = Proc.new {
715
716
  if @config["create_cluster"]
716
- MU::Cloud::AWS.rds(region: @config['region'], credentials: @config['credentials']).describe_db_cluster_snapshots(db_cluster_snapshot_identifier: snap_id).db_cluster_snapshots.first.status != "available"
717
+ MU::Cloud::AWS.rds(region: @region, credentials: @credentials).describe_db_cluster_snapshots(db_cluster_snapshot_identifier: snap_id).db_cluster_snapshots.first.status != "available"
717
718
  else
718
- MU::Cloud::AWS.rds(region: @config['region'], credentials: @config['credentials']).describe_db_snapshots(db_snapshot_identifier: snap_id).db_snapshots.first.status != "available"
719
+ MU::Cloud::AWS.rds(region: @region, credentials: @credentials).describe_db_snapshots(db_snapshot_identifier: snap_id).db_snapshots.first.status != "available"
719
720
  end
720
721
  }
721
722
 
@@ -732,9 +733,9 @@ dependencies
732
733
  src_ref = MU::Config::Ref.get(@config["source"])
733
734
  resp =
734
735
  if @config["create_cluster"]
735
- MU::Cloud::AWS.rds(region: @config['region'], credentials: @config['credentials']).describe_db_cluster_snapshots(db_cluster_snapshot_identifier: src_ref.id)
736
+ MU::Cloud::AWS.rds(region: @region, credentials: @credentials).describe_db_cluster_snapshots(db_cluster_snapshot_identifier: src_ref.id)
736
737
  else
737
- MU::Cloud::AWS.rds(region: @config['region'], credentials: @config['credentials']).describe_db_snapshots(db_snapshot_identifier: src_ref.id)
738
+ MU::Cloud::AWS.rds(region: @region, credentials: @credentials).describe_db_snapshots(db_snapshot_identifier: src_ref.id)
738
739
  end
739
740
 
740
741
  snapshots = @config["create_cluster"] ? resp.db_cluster_snapshots : resp.db_snapshots
@@ -761,7 +762,7 @@ dependencies
761
762
  end
762
763
 
763
764
  # @return [Array<Thread>]
764
- def self.threaded_resource_purge(describe_method, list_method, id_method, arn_type, region, credentials, ignoremaster, known: [])
765
+ def self.threaded_resource_purge(describe_method, list_method, id_method, arn_type, region, credentials, ignoremaster, known: [], deploy_id: MU.deploy_id)
765
766
  deletia = []
766
767
 
767
768
  resp = MU::Cloud::AWS.rds(credentials: credentials, region: region).send(describe_method)
@@ -774,7 +775,7 @@ dependencies
774
775
  next
775
776
  end
776
777
 
777
- if should_delete?(tags, resource.send(id_method), ignoremaster, MU.deploy_id, MU.mu_public_ip, known)
778
+ if should_delete?(tags, resource.send(id_method), ignoremaster, deploy_id, MU.mu_public_ip, known)
778
779
  deletia << resource.send(id_method)
779
780
  end
780
781
  }
@@ -795,29 +796,32 @@ dependencies
795
796
  # @param ignoremaster [Boolean]: If true, will remove resources not flagged as originating from this Mu server
796
797
  # @param region [String]: The cloud provider region in which to operate
797
798
  # @return [void]
798
- def self.cleanup(noop: false, ignoremaster: false, credentials: nil, region: MU.curRegion, flags: {})
799
+ def self.cleanup(noop: false, deploy_id: MU.deploy_id, ignoremaster: false, credentials: nil, region: MU.curRegion, flags: {})
800
+
801
+ threads = []
799
802
 
800
803
  ["instance", "cluster"].each { |type|
801
- threaded_resource_purge("describe_db_#{type}s".to_sym, "db_#{type}s".to_sym, "db_#{type}_identifier".to_sym, (type == "instance" ? "db" : "cluster"), region, credentials, ignoremaster, known: flags['known']) { |id|
802
- terminate_rds_instance(nil, noop: noop, skipsnapshots: flags["skipsnapshots"], region: region, deploy_id: MU.deploy_id, cloud_id: id, mu_name: id.upcase, credentials: credentials, cluster: (type == "cluster"), known: flags['known'])
804
+ threads.concat threaded_resource_purge("describe_db_#{type}s".to_sym, "db_#{type}s".to_sym, "db_#{type}_identifier".to_sym, (type == "instance" ? "db" : "cluster"), region, credentials, ignoremaster, known: flags['known'], deploy_id: deploy_id) { |id|
805
+ terminate_rds_instance(nil, noop: noop, skipsnapshots: flags["skipsnapshots"], region: region, deploy_id: deploy_id, cloud_id: id, mu_name: id.upcase, credentials: credentials, cluster: (type == "cluster"), known: flags['known'])
803
806
 
804
- }.each { |t|
805
- t.join
806
807
  }
807
808
  }
809
+ threads.each { |t|
810
+ t.join
811
+ }
808
812
 
809
- threads = threaded_resource_purge(:describe_db_subnet_groups, :db_subnet_groups, :db_subnet_group_name, "subgrp", region, credentials, ignoremaster, known: flags['known']) { |id|
813
+ threads = threaded_resource_purge(:describe_db_subnet_groups, :db_subnet_groups, :db_subnet_group_name, "subgrp", region, credentials, ignoremaster, known: flags['known'], deploy_id: deploy_id) { |id|
810
814
  MU.log "Deleting RDS subnet group #{id}"
811
815
  MU.retrier([Aws::RDS::Errors::InvalidDBSubnetGroupStateFault], wait: 30, max: 5, ignoreme: [Aws::RDS::Errors::DBSubnetGroupNotFoundFault]) {
812
- MU::Cloud::AWS.rds(region: region).delete_db_subnet_group(db_subnet_group_name: id) if !noop
816
+ MU::Cloud::AWS.rds(region: region, credentials: credentials).delete_db_subnet_group(db_subnet_group_name: id) if !noop
813
817
  }
814
818
  }
815
819
 
816
820
  ["db", "db_cluster"].each { |type|
817
- threads.concat threaded_resource_purge("describe_#{type}_parameter_groups".to_sym, "#{type}_parameter_groups".to_sym, "#{type}_parameter_group_name".to_sym, (type == "db" ? "pg" : "cluster-pg"), region, credentials, ignoremaster, known: flags['known']) { |id|
821
+ threads.concat threaded_resource_purge("describe_#{type}_parameter_groups".to_sym, "#{type}_parameter_groups".to_sym, "#{type}_parameter_group_name".to_sym, (type == "db" ? "pg" : "cluster-pg"), region, credentials, ignoremaster, known: flags['known'], deploy_id: deploy_id) { |id|
818
822
  MU.log "Deleting RDS #{type} parameter group #{id}"
819
823
  MU.retrier([Aws::RDS::Errors::InvalidDBParameterGroupState], wait: 30, max: 5, ignoreme: [Aws::RDS::Errors::DBParameterGroupNotFound]) {
820
- MU::Cloud::AWS.rds(region: region).send("delete_#{type}_parameter_group", { "#{type}_parameter_group_name".to_sym => id }) if !noop
824
+ MU::Cloud::AWS.rds(region: region, credentials: credentials).send("delete_#{type}_parameter_group", { "#{type}_parameter_group_name".to_sym => id }) if !noop
821
825
  }
822
826
  }
823
827
  }
@@ -1259,7 +1263,7 @@ dependencies
1259
1263
  def add_basic
1260
1264
 
1261
1265
  getPassword
1262
- if @config['source'].nil? or @config['region'] != @config['source'].region
1266
+ if @config['source'].nil? or @region != @config['source'].region
1263
1267
  manageSubnetGroup if @vpc
1264
1268
  else
1265
1269
  MU.log "Note: Read Replicas automatically reside in the same subnet group as the source database, if they're both in the same region. This replica may not land in the VPC you intended.", MU::WARN
@@ -1274,7 +1278,7 @@ dependencies
1274
1278
 
1275
1279
 
1276
1280
  def add_cluster_node
1277
- cluster = MU::Config::Ref.get(@config["member_of_cluster"]).kitten(@deploy, debug: true)
1281
+ cluster = MU::Config::Ref.get(@config["member_of_cluster"]).kitten(@deploy)
1278
1282
  if cluster.nil? or cluster.cloud_id.nil?
1279
1283
  raise MuError.new "Failed to resolve parent cluster of #{@mu_name}", details: @config["member_of_cluster"].to_h
1280
1284
  end
@@ -1344,18 +1348,18 @@ dependencies
1344
1348
  if %w{existing_snapshot new_snapshot}.include?(@config["creation_style"])
1345
1349
  clean_parent_opts.call
1346
1350
  MU.log "Creating database #{noun} #{@cloud_id} from snapshot #{@config["snapshot_id"]}"
1347
- MU::Cloud::AWS.rds(region: @config['region'], credentials: @config['credentials']).send("restore_db_#{noun}_from_#{noun == "instance" ? "db_" : ""}snapshot".to_sym, params)
1351
+ MU::Cloud::AWS.rds(region: @region, credentials: @credentials).send("restore_db_#{noun}_from_#{noun == "instance" ? "db_" : ""}snapshot".to_sym, params)
1348
1352
  else
1349
1353
  clean_parent_opts.call if noun == "instance" and params[:db_cluster_identifier]
1350
- MU.log "Creating pristine database #{noun} #{@cloud_id} (#{@config['name']}) in #{@config['region']}", MU::NOTICE, details: params
1351
- MU::Cloud::AWS.rds(region: @config['region'], credentials: @config['credentials']).send("create_db_#{noun}".to_sym, params)
1354
+ MU.log "Creating pristine database #{noun} #{@cloud_id} (#{@config['name']}) in #{@region}", MU::NOTICE, details: params
1355
+ MU::Cloud::AWS.rds(region: @region, credentials: @credentials).send("create_db_#{noun}".to_sym, params)
1352
1356
  end
1353
1357
  }
1354
1358
  end
1355
1359
 
1356
1360
  # creation_style = point_in_time
1357
1361
  def create_point_in_time
1358
- @config["source"].kitten(@deploy, debug: true)
1362
+ @config["source"].kitten(@deploy)
1359
1363
  if !@config["source"].id
1360
1364
  raise MuError.new "Database '#{@config['name']}' couldn't resolve cloud id for source database", details: @config["source"].to_h
1361
1365
  end
@@ -1375,13 +1379,13 @@ dependencies
1375
1379
 
1376
1380
  MU.retrier([Aws::RDS::Errors::InvalidParameterValue], max: 15, wait: 20) {
1377
1381
  MU.log "Creating database #{@config['create_cluster'] ? "cluster" : "instance" } #{@cloud_id} based on point in time backup '#{@config['restore_time']}' of #{@config['source'].id}"
1378
- MU::Cloud::AWS.rds(region: @config['region'], credentials: @config['credentials']).send("restore_db_#{@config['create_cluster'] ? "cluster" : "instance"}_to_point_in_time".to_sym, params)
1382
+ MU::Cloud::AWS.rds(region: @region, credentials: @credentials).send("restore_db_#{@config['create_cluster'] ? "cluster" : "instance"}_to_point_in_time".to_sym, params)
1379
1383
  }
1380
1384
  end
1381
1385
 
1382
1386
  # creation_style = new, existing and read_replica_of is not nil
1383
1387
  def create_read_replica
1384
- @config["source"].kitten(@deploy, debug: true)
1388
+ @config["source"].kitten(@deploy)
1385
1389
  if !@config["source"].id
1386
1390
  raise MuError.new "Database '#{@config['name']}' couldn't resolve cloud id for source database", details: @config["source"].to_h
1387
1391
  end
@@ -1396,8 +1400,8 @@ dependencies
1396
1400
  db_subnet_group_name: @config["subnet_group_name"],
1397
1401
  storage_type: @config["storage_type"]
1398
1402
  }
1399
- if @config["source"].region and @config['region'] != @config["source"].region
1400
- params[:source_db_instance_identifier] = MU::Cloud::AWS::Database.getARN(@config["source"].id, "db", "rds", region: @config["source"].region, credentials: @config['credentials'])
1403
+ if @config["source"].region and @region != @config["source"].region
1404
+ params[:source_db_instance_identifier] = MU::Cloud::AWS::Database.getARN(@config["source"].id, "db", "rds", region: @config["source"].region, credentials: @credentials)
1401
1405
  end
1402
1406
 
1403
1407
  params[:port] = @config["port"] if @config["port"]
@@ -1412,7 +1416,7 @@ dependencies
1412
1416
 
1413
1417
  MU.retrier([Aws::RDS::Errors::InvalidDBInstanceState, Aws::RDS::Errors::InvalidParameterValue, Aws::RDS::Errors::DBSubnetGroupNotAllowedFault], max: 10, wait: 30, on_retry: on_retry) {
1414
1418
  MU.log "Creating read replica database instance #{@cloud_id} for #{@config['source'].id}"
1415
- MU::Cloud::AWS.rds(region: @config['region'], credentials: @config['credentials']).create_db_instance_read_replica(params)
1419
+ MU::Cloud::AWS.rds(region: @region, credentials: @credentials).create_db_instance_read_replica(params)
1416
1420
  }
1417
1421
  end
1418
1422
 
@@ -1471,7 +1475,7 @@ dependencies
1471
1475
  end
1472
1476
  mod_config[:vpc_security_group_ids] << localdeploy_rule.cloud_id
1473
1477
 
1474
- MU::Cloud::AWS.rds(region: @config['region'], credentials: @config['credentials']).modify_db_instance(mod_config)
1478
+ MU::Cloud::AWS.rds(region: @region, credentials: @credentials).modify_db_instance(mod_config)
1475
1479
  MU.log "Modified database #{@cloud_id} with new security groups: #{mod_config}", MU::NOTICE
1476
1480
  end
1477
1481
 
@@ -1483,7 +1487,7 @@ dependencies
1483
1487
  db_instance_identifier: @cloud_id,
1484
1488
  apply_immediately: true
1485
1489
  }
1486
- if !@config["read_replica_of"] or @config['region'] == @config['source'].region
1490
+ if !@config["read_replica_of"] or @region == @config['source'].region
1487
1491
  mod_config[:vpc_security_group_ids] = @config["vpc_security_group_ids"]
1488
1492
  end
1489
1493
 
@@ -1500,7 +1504,7 @@ dependencies
1500
1504
  mod_config[:preferred_maintenance_window] = @config["preferred_maintenance_window"]
1501
1505
  end
1502
1506
 
1503
- MU::Cloud::AWS.rds(region: @config['region'], credentials: @config['credentials']).modify_db_instance(mod_config)
1507
+ MU::Cloud::AWS.rds(region: @region, credentials: @credentials).modify_db_instance(mod_config)
1504
1508
  wait_until_available
1505
1509
  end
1506
1510
 
@@ -1508,7 +1512,7 @@ dependencies
1508
1512
  if @config['allow_major_version_upgrade'] && @config["creation_style"] == "new"
1509
1513
  MU.log "Setting major database version upgrade on #{@cloud_id}'"
1510
1514
 
1511
- MU::Cloud::AWS.rds(region: @config['region'], credentials: @config['credentials']).modify_db_instance(
1515
+ MU::Cloud::AWS.rds(region: @region, credentials: @credentials).modify_db_instance(
1512
1516
  db_instance_identifier: @cloud_id,
1513
1517
  apply_immediately: true,
1514
1518
  allow_major_version_upgrade: true
@@ -1653,7 +1657,7 @@ dependencies
1653
1657
 
1654
1658
  raise MuError, "terminate_rds_instance requires a non-nil database descriptor (#{cloud_id})" if db.nil? or cloud_id.nil?
1655
1659
 
1656
- MU.retrier([], wait: 60, loop_if: Proc.new { %w{creating modifying backing-up}.include?(cluster ? db.status : db.db_instance_status) }) {
1660
+ MU.retrier([], wait: 60, loop_if: Proc.new { %w{creating modifying backing-up}.include?(cluster ? db.status : db.db_instance_status) }, loop_msg: "Waiting for RDS #{cluster ? "cluster" : "instance"} #{cloud_id} to be in a valid state for deletion") {
1657
1661
  db = MU::Cloud::AWS::Database.find(cloud_id: cloud_id, region: region, credentials: credentials, cluster: cluster).values.first
1658
1662
  return if db.nil?
1659
1663
  }
@@ -1673,7 +1677,7 @@ dependencies
1673
1677
  params[:skip_final_snapshot] = false
1674
1678
  params[:final_db_snapshot_identifier] = "#{cloud_id}-mufinal"
1675
1679
  end
1676
-
1680
+ sleep 30
1677
1681
  if !noop
1678
1682
  on_retry = Proc.new { |e|
1679
1683
  if [Aws::RDS::Errors::DBSnapshotAlreadyExists, Aws::RDS::Errors::DBClusterSnapshotAlreadyExistsFault, Aws::RDS::Errors::DBClusterQuotaExceeded].include?(e.class)
@@ -1688,7 +1692,7 @@ dependencies
1688
1692
  end
1689
1693
  }
1690
1694
  del_db = nil
1691
- MU.retrier([], wait: 10, ignoreme: [Aws::RDS::Errors::DBInstanceNotFound], loop_if: Proc.new { del_db and ((!cluster and del_db.db_instance_status != "deleted") or (cluster and del_db.status != "deleted")) }) {
1695
+ MU.retrier([], wait: 10, ignoreme: [Aws::RDS::Errors::DBInstanceNotFound], loop_if: Proc.new { del_db and ((!cluster and del_db.db_instance_status != "deleted") or (cluster and del_db.status != "deleted")) }, loop_msg: "Waiting for RDS #{cluster ? "cluster" : "instance"} #{cloud_id} to delete") {
1692
1696
  del_db = MU::Cloud::AWS::Database.find(cloud_id: cloud_id, region: region, cluster: cluster).values.first
1693
1697
  }
1694
1698
  end
@@ -25,7 +25,7 @@ module MU
25
25
  super
26
26
  @mu_name ||= @deploy.getResourceName(@config["name"])
27
27
 
28
- MU.setVar("curRegion", @config['region']) if !@config['region'].nil?
28
+ MU.setVar("curRegion", @region) if !@region.nil?
29
29
  end
30
30
 
31
31
  # Called automatically by {MU::Deploy#createResources}
@@ -42,7 +42,7 @@ module MU
42
42
  params = {
43
43
  :name => @config['name'],
44
44
  :hosted_zone_config => {
45
- :comment => MU.deploy_id
45
+ :comment => @deploy.deploy_id
46
46
  },
47
47
  :caller_reference => @deploy.getResourceName(@config['name'])
48
48
  }
@@ -119,7 +119,7 @@ module MU
119
119
  if @dependencies.has_key?('loadbalancer') and @dependencies['loadbalancer'].has_key?(dnsrec['target']) and !@dependencies['loadbalancer'][dnsrec['target']].cloudobj.nil? and dnsrec['deploy_id'].nil?
120
120
  @dependencies['loadbalancer'][dnsrec['target']].cloudobj.notify['dns']
121
121
  elsif dnsrec['deploy_id']
122
- found = MU::MommaCat.findStray("AWS", "loadbalancer", deploy_id: dnsrec["deploy_id"], mu_name: dnsrec["target"], region: @config["region"])
122
+ found = MU::MommaCat.findStray("AWS", "loadbalancer", deploy_id: dnsrec["deploy_id"], mu_name: dnsrec["target"], region: @region)
123
123
  raise MuError, "Couldn't find #{dnsrec['mu_type']} #{dnsrec["target"]}" if found.nil? || found.empty?
124
124
  found.first.deploydata['dns']
125
125
  end
@@ -128,7 +128,7 @@ module MU
128
128
  MU.log "dnsrec['target'] #{dnsrec['target']}"
129
129
  deploydata = @dependencies['server'][dnsrec['target']].deploydata
130
130
  elsif dnsrec['deploy_id']
131
- found = MU::MommaCat.findStray("AWS", "server", deploy_id: dnsrec["deploy_id"], mu_name: dnsrec["target"], region: @config["region"])
131
+ found = MU::MommaCat.findStray("AWS", "server", deploy_id: dnsrec["deploy_id"], mu_name: dnsrec["target"], region: @region)
132
132
  raise MuError, "Couldn't find #{dnsrec['mu_type']} #{dnsrec["target"]}" if found.nil? || found.empty?
133
133
  deploydata = found.first.deploydata
134
134
  end
@@ -159,7 +159,7 @@ module MU
159
159
  if @dependencies.has_key?(dnsrec['mu_type']) && dnsrec['deploy_id'].nil?
160
160
  @dependencies[dnsrec['mu_type']][dnsrec['target']].deploydata['endpoint']
161
161
  elsif dnsrec['deploy_id']
162
- found = MU::MommaCat.findStray("AWS", "database", deploy_id: dnsrec["deploy_id"], mu_name: dnsrec["target"], region: @config["region"])
162
+ found = MU::MommaCat.findStray("AWS", "database", deploy_id: dnsrec["deploy_id"], mu_name: dnsrec["target"], region: @region)
163
163
  raise MuError, "Couldn't find #{dnsrec['mu_type']} #{dnsrec["target"]}" if found.nil? || found.empty?
164
164
  found.first.deploydata['endpoint']
165
165
  end
@@ -173,11 +173,29 @@ module MU
173
173
  return resp.hosted_zone if @config["create_zone"]
174
174
  end
175
175
 
176
+ # Resolve a record entry (as in {MU::Config::BasketofKittens::dnszones::records} to the full DNS name we would assign it
177
+ def self.recordToName(record)
178
+ shortname = record['name']
179
+ shortname += ".#{MU.environment.downcase}" if record["append_environment_name"]
180
+
181
+ zone = if record['zone'].has_key?("id")
182
+ MU::Cloud::DNSZone.find(cloud_id: record['zone']['id']).values.first
183
+ else
184
+ MU::Cloud::DNSZone.find(cloud_id: record['zone']['name']).values.first
185
+ end
186
+
187
+ if zone.nil?
188
+ raise MuError.new "Failed to locate Route53 DNS Zone", details: record['zone']
189
+ end
190
+
191
+ shortname+"."+zone.name.sub(/\.$/, '')
192
+ end
193
+
176
194
  # Wrapper for {MU::Cloud::AWS::DNSZone.manageRecord}. Spawns threads to create all
177
195
  # requested records in background and returns immediately.
178
196
  # @param cfg [Array]: An array of parsed {MU::Config::BasketofKittens::dnszones::records} objects.
179
197
  # @param target [String]: Optional target for the records to be created. Overrides targets embedded in cfg records.
180
- def self.createRecordsFromConfig(cfg, target: nil)
198
+ def self.createRecordsFromConfig(cfg, target: nil, name_only: false)
181
199
  return if cfg.nil?
182
200
  record_threads = []
183
201
 
@@ -190,7 +208,6 @@ module MU
190
208
  zone = MU::Cloud::DNSZone.find(cloud_id: record['zone']['name']).values.first
191
209
  end
192
210
 
193
- raise MuError, "Failed to locate Route53 DNS Zone for domain #{record['zone']['name']}" if zone.nil?
194
211
 
195
212
  healthcheck_id = nil
196
213
  record['target'] = target if !target.nil?
@@ -625,7 +642,7 @@ module MU
625
642
  # )
626
643
  # deploydata.merge!(MU.structToHash(resp.hosted_zone))
627
644
  # deploydata['vpcs'] = @config['vpcs'] if !@config['vpcs'].nil?
628
- # deploydata["region"] = @config['region'] if !@config['region'].nil?
645
+ # deploydata["region"] = @region if !@region.nil?
629
646
  # @deploy.notify(MU::Cloud::DNSZone.cfg_plural, mu_name, deploydata)
630
647
  # return deploydata
631
648
 
@@ -666,7 +683,7 @@ module MU
666
683
 
667
684
  # Called by {MU::Cleanup}. Locates resources that were created by the
668
685
  # currently-loaded deployment, and purges them.
669
- def self.cleanup(noop: false, ignoremaster: false, region: MU.curRegion, credentials: nil, flags: {})
686
+ def self.cleanup(noop: false, deploy_id: MU.deploy_id, ignoremaster: false, region: MU.curRegion, credentials: nil, flags: {})
670
687
  MU.log "AWS::DNSZone.cleanup: need to support flags['known']", MU::DEBUG, details: flags
671
688
 
672
689
  threads = []
@@ -679,7 +696,7 @@ module MU
679
696
  muid_match = false
680
697
  mumaster_match = false
681
698
  tags.each { |tag|
682
- muid_match = true if tag.key == "MU-ID" and tag.value == MU.deploy_id
699
+ muid_match = true if tag.key == "MU-ID" and tag.value == deploy_id
683
700
  mumaster_match = true if tag.key == "MU-MASTER-IP" and tag.value == MU.mu_public_ip
684
701
  }
685
702
 
@@ -723,7 +740,7 @@ module MU
723
740
  t.join
724
741
  }
725
742
 
726
- zones = MU::Cloud::DNSZone.find(deploy_id: MU.deploy_id, region: region)
743
+ zones = MU::Cloud::DNSZone.find(deploy_id: deploy_id, region: region)
727
744
  zones.values.each { |zone|
728
745
  MU.log "Purging DNS Zone '#{zone.name}' (#{zone.id})"
729
746
  if !noop
@@ -779,7 +796,7 @@ module MU
779
796
 
780
797
  # TO DO: if we have more than one record it will retry the deletion multiple times and will throw Aws::Route53::Errors::InvalidChangeBatch / record not found even though the record was deleted
781
798
  zone_rrsets.each { |record|
782
- if record.name.match(MU.deploy_id.downcase)
799
+ if record.name.match(deploy_id.downcase)
783
800
  resource_records = []
784
801
  record.resource_records.each { |rrecord|
785
802
  resource_records << rrecord.value