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.
- checksums.yaml +4 -4
- data/Dockerfile +1 -1
- data/ansible/roles/mu-nat/tasks/main.yml +3 -0
- data/bin/mu-adopt +12 -1
- data/bin/mu-aws-setup +41 -7
- data/bin/mu-azure-setup +34 -0
- data/bin/mu-configure +214 -119
- data/bin/mu-gcp-setup +37 -2
- data/bin/mu-load-config.rb +2 -1
- data/bin/mu-node-manage +3 -0
- data/bin/mu-refresh-ssl +67 -0
- data/bin/mu-run-tests +28 -6
- data/bin/mu-self-update +30 -10
- data/bin/mu-upload-chef-artifacts +30 -26
- data/cloud-mu.gemspec +10 -8
- data/cookbooks/mu-master/attributes/default.rb +5 -1
- data/cookbooks/mu-master/metadata.rb +2 -2
- data/cookbooks/mu-master/recipes/default.rb +81 -26
- data/cookbooks/mu-master/recipes/init.rb +197 -62
- data/cookbooks/mu-master/recipes/update_nagios_only.rb +1 -1
- data/cookbooks/mu-master/recipes/vault.rb +78 -77
- data/cookbooks/mu-master/templates/default/mods/rewrite.conf.erb +1 -0
- data/cookbooks/mu-master/templates/default/nagios.conf.erb +103 -0
- data/cookbooks/mu-master/templates/default/web_app.conf.erb +14 -30
- data/cookbooks/mu-tools/attributes/default.rb +12 -0
- data/cookbooks/mu-tools/files/centos-6/CentOS-Base.repo +47 -0
- data/cookbooks/mu-tools/libraries/helper.rb +98 -4
- data/cookbooks/mu-tools/libraries/monkey.rb +1 -1
- data/cookbooks/mu-tools/recipes/apply_security.rb +31 -9
- data/cookbooks/mu-tools/recipes/aws_api.rb +8 -2
- data/cookbooks/mu-tools/recipes/base_repositories.rb +1 -1
- data/cookbooks/mu-tools/recipes/gcloud.rb +2 -9
- data/cookbooks/mu-tools/recipes/google_api.rb +7 -0
- data/cookbooks/mu-tools/recipes/rsyslog.rb +8 -1
- data/cookbooks/mu-tools/resources/disk.rb +113 -42
- data/cookbooks/mu-tools/resources/mommacat_request.rb +1 -2
- data/cookbooks/mu-tools/templates/centos-8/sshd_config.erb +215 -0
- data/extras/Gemfile.lock.bootstrap +394 -0
- data/extras/bucketstubs/error.html +0 -0
- data/extras/bucketstubs/index.html +0 -0
- data/extras/clean-stock-amis +11 -3
- data/extras/generate-stock-images +6 -3
- data/extras/git_rpm/build.sh +20 -0
- data/extras/git_rpm/mugit.spec +53 -0
- data/extras/image-generators/AWS/centos7.yaml +19 -16
- data/extras/image-generators/AWS/{rhel7.yaml → rhel71.yaml} +0 -0
- data/extras/image-generators/AWS/{win2k12.yaml → win2k12r2.yaml} +0 -0
- data/extras/image-generators/VMWare/centos8.yaml +15 -0
- data/extras/openssl_rpm/build.sh +19 -0
- data/extras/openssl_rpm/mussl.spec +46 -0
- data/extras/python_rpm/muthon.spec +14 -4
- data/extras/ruby_rpm/muby.spec +9 -5
- data/extras/sqlite_rpm/build.sh +19 -0
- data/extras/sqlite_rpm/muqlite.spec +47 -0
- data/install/installer +7 -5
- data/modules/mommacat.ru +2 -2
- data/modules/mu.rb +14 -7
- data/modules/mu/adoption.rb +5 -5
- data/modules/mu/cleanup.rb +47 -25
- data/modules/mu/cloud.rb +29 -1
- data/modules/mu/cloud/dnszone.rb +0 -2
- data/modules/mu/cloud/machine_images.rb +1 -1
- data/modules/mu/cloud/providers.rb +6 -1
- data/modules/mu/cloud/resource_base.rb +16 -7
- data/modules/mu/cloud/ssh_sessions.rb +5 -1
- data/modules/mu/cloud/wrappers.rb +20 -7
- data/modules/mu/config.rb +28 -12
- data/modules/mu/config/bucket.rb +31 -2
- data/modules/mu/config/cache_cluster.rb +1 -1
- data/modules/mu/config/cdn.rb +100 -0
- data/modules/mu/config/container_cluster.rb +1 -1
- data/modules/mu/config/database.rb +3 -3
- data/modules/mu/config/dnszone.rb +4 -3
- data/modules/mu/config/endpoint.rb +1 -0
- data/modules/mu/config/firewall_rule.rb +1 -1
- data/modules/mu/config/function.rb +16 -7
- data/modules/mu/config/job.rb +89 -0
- data/modules/mu/config/notifier.rb +7 -18
- data/modules/mu/config/ref.rb +55 -9
- data/modules/mu/config/schema_helpers.rb +12 -3
- data/modules/mu/config/server.rb +11 -5
- data/modules/mu/config/server_pool.rb +2 -2
- data/modules/mu/config/vpc.rb +11 -10
- data/modules/mu/defaults/AWS.yaml +106 -106
- data/modules/mu/deploy.rb +40 -14
- data/modules/mu/groomers/chef.rb +2 -2
- data/modules/mu/master.rb +70 -3
- data/modules/mu/mommacat.rb +28 -9
- data/modules/mu/mommacat/daemon.rb +13 -7
- data/modules/mu/mommacat/naming.rb +2 -2
- data/modules/mu/mommacat/search.rb +16 -5
- data/modules/mu/mommacat/storage.rb +67 -32
- data/modules/mu/providers/aws.rb +298 -85
- data/modules/mu/providers/aws/alarm.rb +5 -5
- data/modules/mu/providers/aws/bucket.rb +284 -50
- data/modules/mu/providers/aws/cache_cluster.rb +26 -26
- data/modules/mu/providers/aws/cdn.rb +782 -0
- data/modules/mu/providers/aws/collection.rb +16 -16
- data/modules/mu/providers/aws/container_cluster.rb +84 -64
- data/modules/mu/providers/aws/database.rb +59 -55
- data/modules/mu/providers/aws/dnszone.rb +29 -12
- data/modules/mu/providers/aws/endpoint.rb +535 -50
- data/modules/mu/providers/aws/firewall_rule.rb +32 -26
- data/modules/mu/providers/aws/folder.rb +1 -1
- data/modules/mu/providers/aws/function.rb +300 -134
- data/modules/mu/providers/aws/group.rb +16 -14
- data/modules/mu/providers/aws/habitat.rb +4 -4
- data/modules/mu/providers/aws/job.rb +469 -0
- data/modules/mu/providers/aws/loadbalancer.rb +67 -45
- data/modules/mu/providers/aws/log.rb +17 -17
- data/modules/mu/providers/aws/msg_queue.rb +22 -13
- data/modules/mu/providers/aws/nosqldb.rb +99 -8
- data/modules/mu/providers/aws/notifier.rb +137 -65
- data/modules/mu/providers/aws/role.rb +119 -83
- data/modules/mu/providers/aws/search_domain.rb +166 -30
- data/modules/mu/providers/aws/server.rb +209 -118
- data/modules/mu/providers/aws/server_pool.rb +95 -130
- data/modules/mu/providers/aws/storage_pool.rb +19 -11
- data/modules/mu/providers/aws/user.rb +5 -5
- data/modules/mu/providers/aws/userdata/linux.erb +5 -4
- data/modules/mu/providers/aws/vpc.rb +109 -54
- data/modules/mu/providers/aws/vpc_subnet.rb +43 -39
- data/modules/mu/providers/azure.rb +78 -12
- data/modules/mu/providers/azure/server.rb +20 -4
- data/modules/mu/providers/cloudformation/server.rb +1 -1
- data/modules/mu/providers/google.rb +21 -5
- data/modules/mu/providers/google/bucket.rb +1 -1
- data/modules/mu/providers/google/container_cluster.rb +1 -1
- data/modules/mu/providers/google/database.rb +1 -1
- data/modules/mu/providers/google/firewall_rule.rb +1 -1
- data/modules/mu/providers/google/folder.rb +7 -3
- data/modules/mu/providers/google/function.rb +66 -31
- data/modules/mu/providers/google/group.rb +1 -1
- data/modules/mu/providers/google/habitat.rb +1 -1
- data/modules/mu/providers/google/loadbalancer.rb +1 -1
- data/modules/mu/providers/google/role.rb +6 -3
- data/modules/mu/providers/google/server.rb +1 -1
- data/modules/mu/providers/google/server_pool.rb +1 -1
- data/modules/mu/providers/google/user.rb +1 -1
- data/modules/mu/providers/google/vpc.rb +28 -3
- data/modules/tests/aws-jobs-functions.yaml +46 -0
- data/modules/tests/aws-servers-with-handrolled-iam.yaml +37 -0
- data/modules/tests/centos6.yaml +4 -0
- data/modules/tests/centos7.yaml +4 -0
- data/modules/tests/ecs.yaml +2 -2
- data/modules/tests/eks.yaml +1 -1
- data/modules/tests/functions/node-function/lambda_function.js +10 -0
- data/modules/tests/functions/python-function/lambda_function.py +12 -0
- data/modules/tests/k8s.yaml +1 -1
- data/modules/tests/microservice_app.yaml +288 -0
- data/modules/tests/rds.yaml +5 -5
- data/modules/tests/regrooms/rds.yaml +5 -5
- data/modules/tests/server-with-scrub-muisms.yaml +1 -1
- data/modules/tests/super_complex_bok.yml +2 -2
- data/modules/tests/super_simple_bok.yml +2 -2
- 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: @
|
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" => @
|
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: @
|
321
|
-
resource_name: MU::Cloud::AWS::Database.getARN(@cloud_id, noun, "rds", region: @
|
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: @
|
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: @
|
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: @
|
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: @
|
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: @
|
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: @
|
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: @
|
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: @
|
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: @
|
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: @
|
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: @
|
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: @
|
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: @
|
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: @
|
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: @
|
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"] ||= @
|
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: @
|
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: @
|
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: @
|
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: @
|
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: @
|
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,
|
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:
|
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 @
|
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
|
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: @
|
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 #{@
|
1351
|
-
MU::Cloud::AWS.rds(region: @
|
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
|
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: @
|
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
|
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 @
|
1400
|
-
params[:source_db_instance_identifier] = MU::Cloud::AWS::Database.getARN(@config["source"].id, "db", "rds", region: @config["source"].region, 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: @
|
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: @
|
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 @
|
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: @
|
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: @
|
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", @
|
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 =>
|
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: @
|
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: @
|
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: @
|
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"] = @
|
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 ==
|
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:
|
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(
|
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
|