cloud-mu 3.1.3 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Dockerfile +15 -3
- data/ansible/roles/mu-windows/README.md +33 -0
- data/ansible/roles/mu-windows/defaults/main.yml +2 -0
- data/ansible/roles/mu-windows/files/LaunchConfig.json +9 -0
- data/ansible/roles/mu-windows/files/config.xml +76 -0
- data/ansible/roles/mu-windows/handlers/main.yml +2 -0
- data/ansible/roles/mu-windows/meta/main.yml +53 -0
- data/ansible/roles/mu-windows/tasks/main.yml +36 -0
- data/ansible/roles/mu-windows/tests/inventory +2 -0
- data/ansible/roles/mu-windows/tests/test.yml +5 -0
- data/ansible/roles/mu-windows/vars/main.yml +2 -0
- data/bin/mu-adopt +21 -13
- data/bin/mu-azure-tests +57 -0
- data/bin/mu-cleanup +2 -4
- data/bin/mu-configure +52 -0
- data/bin/mu-deploy +3 -3
- data/bin/mu-findstray-tests +25 -0
- data/bin/mu-gen-docs +2 -4
- data/bin/mu-load-config.rb +4 -4
- data/bin/mu-node-manage +15 -16
- data/bin/mu-run-tests +147 -37
- data/cloud-mu.gemspec +22 -20
- data/cookbooks/mu-activedirectory/resources/domain.rb +4 -4
- data/cookbooks/mu-activedirectory/resources/domain_controller.rb +4 -4
- data/cookbooks/mu-tools/libraries/helper.rb +3 -2
- data/cookbooks/mu-tools/libraries/monkey.rb +35 -0
- data/cookbooks/mu-tools/recipes/apply_security.rb +14 -14
- data/cookbooks/mu-tools/recipes/aws_api.rb +9 -0
- data/cookbooks/mu-tools/recipes/eks.rb +2 -2
- data/cookbooks/mu-tools/recipes/google_api.rb +2 -2
- data/cookbooks/mu-tools/recipes/selinux.rb +2 -1
- data/cookbooks/mu-tools/recipes/windows-client.rb +163 -164
- data/cookbooks/mu-tools/resources/disk.rb +1 -1
- data/cookbooks/mu-tools/resources/windows_users.rb +44 -43
- data/extras/clean-stock-amis +25 -19
- data/extras/generate-stock-images +1 -0
- data/extras/image-generators/AWS/win2k12.yaml +18 -13
- data/extras/image-generators/AWS/win2k16.yaml +18 -13
- data/extras/image-generators/AWS/win2k19.yaml +21 -0
- data/extras/image-generators/Google/centos6.yaml +1 -0
- data/extras/image-generators/Google/centos7.yaml +1 -1
- data/modules/mommacat.ru +6 -16
- data/modules/mu.rb +158 -111
- data/modules/mu/adoption.rb +404 -71
- data/modules/mu/cleanup.rb +221 -306
- data/modules/mu/cloud.rb +129 -1633
- data/modules/mu/cloud/database.rb +49 -0
- data/modules/mu/cloud/dnszone.rb +44 -0
- data/modules/mu/cloud/machine_images.rb +212 -0
- data/modules/mu/cloud/providers.rb +81 -0
- data/modules/mu/cloud/resource_base.rb +926 -0
- data/modules/mu/cloud/server.rb +40 -0
- data/modules/mu/cloud/server_pool.rb +1 -0
- data/modules/mu/cloud/ssh_sessions.rb +228 -0
- data/modules/mu/cloud/winrm_sessions.rb +237 -0
- data/modules/mu/cloud/wrappers.rb +169 -0
- data/modules/mu/config.rb +171 -1767
- data/modules/mu/config/alarm.rb +2 -6
- data/modules/mu/config/bucket.rb +32 -3
- data/modules/mu/config/cache_cluster.rb +2 -2
- data/modules/mu/config/cdn.rb +100 -0
- data/modules/mu/config/collection.rb +4 -4
- data/modules/mu/config/container_cluster.rb +9 -4
- data/modules/mu/config/database.rb +84 -105
- data/modules/mu/config/database.yml +1 -2
- data/modules/mu/config/dnszone.rb +10 -9
- data/modules/mu/config/doc_helpers.rb +516 -0
- data/modules/mu/config/endpoint.rb +5 -4
- data/modules/mu/config/firewall_rule.rb +103 -4
- data/modules/mu/config/folder.rb +4 -4
- data/modules/mu/config/function.rb +19 -10
- data/modules/mu/config/group.rb +4 -4
- data/modules/mu/config/habitat.rb +4 -4
- data/modules/mu/config/job.rb +89 -0
- data/modules/mu/config/loadbalancer.rb +60 -14
- data/modules/mu/config/log.rb +4 -4
- data/modules/mu/config/msg_queue.rb +4 -4
- data/modules/mu/config/nosqldb.rb +4 -4
- data/modules/mu/config/notifier.rb +10 -21
- data/modules/mu/config/ref.rb +411 -0
- data/modules/mu/config/role.rb +4 -4
- data/modules/mu/config/schema_helpers.rb +509 -0
- data/modules/mu/config/search_domain.rb +4 -4
- data/modules/mu/config/server.rb +98 -71
- data/modules/mu/config/server.yml +1 -0
- data/modules/mu/config/server_pool.rb +5 -9
- data/modules/mu/config/storage_pool.rb +1 -1
- data/modules/mu/config/tail.rb +200 -0
- data/modules/mu/config/user.rb +4 -4
- data/modules/mu/config/vpc.rb +71 -27
- data/modules/mu/config/vpc.yml +0 -1
- data/modules/mu/defaults/AWS.yaml +91 -68
- data/modules/mu/defaults/Azure.yaml +1 -0
- data/modules/mu/defaults/Google.yaml +3 -2
- data/modules/mu/deploy.rb +43 -26
- data/modules/mu/groomer.rb +17 -2
- data/modules/mu/groomers/ansible.rb +188 -41
- data/modules/mu/groomers/chef.rb +116 -55
- data/modules/mu/logger.rb +127 -148
- data/modules/mu/master.rb +410 -2
- data/modules/mu/master/chef.rb +3 -4
- data/modules/mu/master/ldap.rb +3 -3
- data/modules/mu/master/ssl.rb +12 -3
- data/modules/mu/mommacat.rb +218 -2612
- data/modules/mu/mommacat/daemon.rb +403 -0
- data/modules/mu/mommacat/naming.rb +473 -0
- data/modules/mu/mommacat/search.rb +495 -0
- data/modules/mu/mommacat/storage.rb +722 -0
- data/modules/mu/{clouds → providers}/README.md +1 -1
- data/modules/mu/{clouds → providers}/aws.rb +380 -122
- data/modules/mu/{clouds → providers}/aws/alarm.rb +7 -5
- data/modules/mu/{clouds → providers}/aws/bucket.rb +297 -59
- data/modules/mu/{clouds → providers}/aws/cache_cluster.rb +37 -71
- data/modules/mu/providers/aws/cdn.rb +782 -0
- data/modules/mu/{clouds → providers}/aws/collection.rb +26 -25
- data/modules/mu/{clouds → providers}/aws/container_cluster.rb +724 -744
- data/modules/mu/providers/aws/database.rb +1744 -0
- data/modules/mu/{clouds → providers}/aws/dnszone.rb +88 -70
- data/modules/mu/providers/aws/endpoint.rb +1072 -0
- data/modules/mu/{clouds → providers}/aws/firewall_rule.rb +220 -247
- data/modules/mu/{clouds → providers}/aws/folder.rb +8 -8
- data/modules/mu/{clouds → providers}/aws/function.rb +300 -142
- data/modules/mu/{clouds → providers}/aws/group.rb +31 -29
- data/modules/mu/{clouds → providers}/aws/habitat.rb +18 -15
- data/modules/mu/providers/aws/job.rb +466 -0
- data/modules/mu/{clouds → providers}/aws/loadbalancer.rb +66 -56
- data/modules/mu/{clouds → providers}/aws/log.rb +17 -14
- data/modules/mu/{clouds → providers}/aws/msg_queue.rb +29 -19
- data/modules/mu/{clouds → providers}/aws/nosqldb.rb +114 -16
- data/modules/mu/{clouds → providers}/aws/notifier.rb +142 -65
- data/modules/mu/{clouds → providers}/aws/role.rb +158 -118
- data/modules/mu/{clouds → providers}/aws/search_domain.rb +201 -59
- data/modules/mu/{clouds → providers}/aws/server.rb +844 -1139
- data/modules/mu/{clouds → providers}/aws/server_pool.rb +74 -65
- data/modules/mu/{clouds → providers}/aws/storage_pool.rb +26 -44
- data/modules/mu/{clouds → providers}/aws/user.rb +24 -25
- data/modules/mu/{clouds → providers}/aws/userdata/README.md +0 -0
- data/modules/mu/{clouds → providers}/aws/userdata/linux.erb +5 -4
- data/modules/mu/{clouds → providers}/aws/userdata/windows.erb +2 -1
- data/modules/mu/{clouds → providers}/aws/vpc.rb +525 -931
- data/modules/mu/providers/aws/vpc_subnet.rb +286 -0
- data/modules/mu/{clouds → providers}/azure.rb +29 -9
- data/modules/mu/{clouds → providers}/azure/container_cluster.rb +3 -8
- data/modules/mu/{clouds → providers}/azure/firewall_rule.rb +18 -11
- data/modules/mu/{clouds → providers}/azure/habitat.rb +8 -6
- data/modules/mu/{clouds → providers}/azure/loadbalancer.rb +5 -5
- data/modules/mu/{clouds → providers}/azure/role.rb +8 -10
- data/modules/mu/{clouds → providers}/azure/server.rb +97 -49
- data/modules/mu/{clouds → providers}/azure/user.rb +6 -8
- data/modules/mu/{clouds → providers}/azure/userdata/README.md +0 -0
- data/modules/mu/{clouds → providers}/azure/userdata/linux.erb +0 -0
- data/modules/mu/{clouds → providers}/azure/userdata/windows.erb +0 -0
- data/modules/mu/{clouds → providers}/azure/vpc.rb +16 -21
- data/modules/mu/{clouds → providers}/cloudformation.rb +18 -7
- data/modules/mu/{clouds → providers}/cloudformation/alarm.rb +3 -3
- data/modules/mu/{clouds → providers}/cloudformation/cache_cluster.rb +3 -3
- data/modules/mu/{clouds → providers}/cloudformation/collection.rb +3 -3
- data/modules/mu/{clouds → providers}/cloudformation/database.rb +6 -17
- data/modules/mu/{clouds → providers}/cloudformation/dnszone.rb +3 -3
- data/modules/mu/{clouds → providers}/cloudformation/firewall_rule.rb +3 -3
- data/modules/mu/{clouds → providers}/cloudformation/loadbalancer.rb +3 -3
- data/modules/mu/{clouds → providers}/cloudformation/log.rb +3 -3
- data/modules/mu/{clouds → providers}/cloudformation/server.rb +7 -7
- data/modules/mu/{clouds → providers}/cloudformation/server_pool.rb +5 -5
- data/modules/mu/{clouds → providers}/cloudformation/vpc.rb +5 -7
- data/modules/mu/{clouds → providers}/docker.rb +0 -0
- data/modules/mu/{clouds → providers}/google.rb +68 -30
- data/modules/mu/{clouds → providers}/google/bucket.rb +13 -15
- data/modules/mu/{clouds → providers}/google/container_cluster.rb +85 -78
- data/modules/mu/{clouds → providers}/google/database.rb +11 -21
- data/modules/mu/{clouds → providers}/google/firewall_rule.rb +15 -14
- data/modules/mu/{clouds → providers}/google/folder.rb +20 -17
- data/modules/mu/{clouds → providers}/google/function.rb +140 -168
- data/modules/mu/{clouds → providers}/google/group.rb +29 -34
- data/modules/mu/{clouds → providers}/google/habitat.rb +21 -22
- data/modules/mu/{clouds → providers}/google/loadbalancer.rb +19 -21
- data/modules/mu/{clouds → providers}/google/role.rb +94 -58
- data/modules/mu/{clouds → providers}/google/server.rb +243 -156
- data/modules/mu/{clouds → providers}/google/server_pool.rb +26 -45
- data/modules/mu/{clouds → providers}/google/user.rb +95 -31
- data/modules/mu/{clouds → providers}/google/userdata/README.md +0 -0
- data/modules/mu/{clouds → providers}/google/userdata/linux.erb +0 -0
- data/modules/mu/{clouds → providers}/google/userdata/windows.erb +0 -0
- data/modules/mu/{clouds → providers}/google/vpc.rb +103 -79
- data/modules/tests/aws-jobs-functions.yaml +46 -0
- data/modules/tests/bucket.yml +4 -0
- data/modules/tests/centos6.yaml +15 -0
- data/modules/tests/centos7.yaml +15 -0
- data/modules/tests/centos8.yaml +12 -0
- data/modules/tests/ecs.yaml +23 -0
- 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/includes-and-params.yaml +2 -1
- data/modules/tests/microservice_app.yaml +288 -0
- data/modules/tests/rds.yaml +108 -0
- data/modules/tests/regrooms/aws-iam.yaml +201 -0
- data/modules/tests/regrooms/bucket.yml +19 -0
- data/modules/tests/regrooms/rds.yaml +123 -0
- data/modules/tests/server-with-scrub-muisms.yaml +2 -1
- data/modules/tests/super_complex_bok.yml +2 -2
- data/modules/tests/super_simple_bok.yml +3 -5
- data/modules/tests/win2k12.yaml +17 -5
- data/modules/tests/win2k16.yaml +25 -0
- data/modules/tests/win2k19.yaml +25 -0
- data/requirements.txt +1 -0
- data/spec/mu/clouds/azure_spec.rb +2 -2
- metadata +240 -154
- data/extras/image-generators/AWS/windows.yaml +0 -18
- data/modules/mu/clouds/aws/database.rb +0 -1985
- data/modules/mu/clouds/aws/endpoint.rb +0 -592
|
@@ -113,14 +113,14 @@ module MU
|
|
|
113
113
|
}
|
|
114
114
|
rescue MU::Groomer::RunError => e
|
|
115
115
|
MU.log "Proceeding after failed initial Groomer run, but #{member.instance_id} may not behave as expected!", MU::WARN, details: e.inspect
|
|
116
|
-
rescue
|
|
116
|
+
rescue StandardError => e
|
|
117
117
|
if !member.nil? and !done
|
|
118
118
|
MU.log "Aborted before I could finish setting up #{@config['name']}, cleaning it up. Stack trace will print once cleanup is complete.", MU::WARN if !@deploy.nocleanup
|
|
119
119
|
MU::MommaCat.unlockAll
|
|
120
120
|
if !@deploy.nocleanup
|
|
121
121
|
Thread.new {
|
|
122
122
|
MU.dupGlobals(parent_thread_id)
|
|
123
|
-
MU::Cloud
|
|
123
|
+
MU::Cloud.resourceClass("AWS", "Server").terminateInstance(id: member.instance_id)
|
|
124
124
|
}
|
|
125
125
|
end
|
|
126
126
|
end
|
|
@@ -193,9 +193,10 @@ module MU
|
|
|
193
193
|
# @return [Array<MU::Cloud::Server>]
|
|
194
194
|
def listNodes
|
|
195
195
|
nodes = []
|
|
196
|
-
me = MU::Cloud::AWS::ServerPool.find(cloud_id: cloud_id)
|
|
197
|
-
|
|
198
|
-
|
|
196
|
+
me = MU::Cloud::AWS::ServerPool.find(cloud_id: cloud_id).values.first
|
|
197
|
+
pp me
|
|
198
|
+
if me and me.instances
|
|
199
|
+
me.instances.each { |instance|
|
|
199
200
|
found = MU::MommaCat.findStray("AWS", "server", cloud_id: instance.instance_id, region: @config["region"], dummy_ok: true)
|
|
200
201
|
nodes.concat(found)
|
|
201
202
|
}
|
|
@@ -293,7 +294,7 @@ module MU
|
|
|
293
294
|
MU::Cloud::AWS.autoscale(region: @config['region'], credentials: @config['credentials']).create_or_update_tags(tag_conf)
|
|
294
295
|
current.instances.each { |instance|
|
|
295
296
|
tag_conf[:tags].each { |t|
|
|
296
|
-
MU::
|
|
297
|
+
MU::Cloud::AWS.createTag(instance.instance_id, t[:key], t[:value], region: @config['region'], credentials: @config['credentials'])
|
|
297
298
|
}
|
|
298
299
|
}
|
|
299
300
|
end
|
|
@@ -305,13 +306,11 @@ module MU
|
|
|
305
306
|
asg_options[:min_size] = @config["min_size"]
|
|
306
307
|
asg_options[:max_size] = @config["max_size"]
|
|
307
308
|
asg_options[:new_instances_protected_from_scale_in] = (@config['scale_in_protection'] == "all")
|
|
308
|
-
tg_arns = []
|
|
309
309
|
if asg_options[:target_group_arns]
|
|
310
310
|
MU::Cloud::AWS.autoscale(region: @config['region'], credentials: @config['credentials']).attach_load_balancer_target_groups(
|
|
311
311
|
auto_scaling_group_name: @mu_name,
|
|
312
312
|
target_group_arns: asg_options[:target_group_arns]
|
|
313
313
|
)
|
|
314
|
-
tg_arns = asg_options[:target_group_arns].dup
|
|
315
314
|
asg_options.delete(:target_group_arns)
|
|
316
315
|
end
|
|
317
316
|
|
|
@@ -365,7 +364,6 @@ module MU
|
|
|
365
364
|
policy_params[:target_tracking_configuration].delete(:preferred_target_group)
|
|
366
365
|
if policy_params[:target_tracking_configuration][:predefined_metric_specification] and
|
|
367
366
|
policy_params[:target_tracking_configuration][:predefined_metric_specification][:predefined_metric_type] == "ALBRequestCountPerTarget"
|
|
368
|
-
lb_path = nil
|
|
369
367
|
lb = @deploy.deployment["loadbalancers"].values.first
|
|
370
368
|
if @deploy.deployment["loadbalancers"].size > 1
|
|
371
369
|
MU.log "Multiple load balancers attached to Autoscale group #{@mu_name}, guessing wildly which one to use for TargetTrackingScaling policy", MU::WARN
|
|
@@ -415,7 +413,7 @@ module MU
|
|
|
415
413
|
}
|
|
416
414
|
if !policy_already_correct
|
|
417
415
|
MU.log "Putting scaling policy #{policy_name} for #{@mu_name}", MU::NOTICE, details: policy_params
|
|
418
|
-
|
|
416
|
+
MU::Cloud::AWS.autoscale(region: @config['region'], credentials: @config['credentials']).put_scaling_policy(policy_params)
|
|
419
417
|
end
|
|
420
418
|
|
|
421
419
|
}
|
|
@@ -423,12 +421,16 @@ module MU
|
|
|
423
421
|
|
|
424
422
|
end
|
|
425
423
|
|
|
424
|
+
@cloud_desc_cache = nil
|
|
426
425
|
# Retrieve the AWS descriptor for this Autoscale group
|
|
427
426
|
# @return [OpenStruct]
|
|
428
|
-
def cloud_desc
|
|
429
|
-
|
|
427
|
+
def cloud_desc(use_cache: true)
|
|
428
|
+
return @cloud_desc_cache if @cloud_desc_cache and use_cache
|
|
429
|
+
return nil if !@cloud_id
|
|
430
|
+
@cloud_desc_cache = MU::Cloud::AWS.autoscale(region: @config['region'], credentials: @config['credentials']).describe_auto_scaling_groups(
|
|
430
431
|
auto_scaling_group_names: [@mu_name]
|
|
431
432
|
).auto_scaling_groups.first
|
|
433
|
+
@cloud_desc_cache
|
|
432
434
|
end
|
|
433
435
|
|
|
434
436
|
# Canonical Amazon Resource Number for this resource
|
|
@@ -486,7 +488,7 @@ module MU
|
|
|
486
488
|
# Reverse-map our cloud description into a runnable config hash.
|
|
487
489
|
# We assume that any values we have in +@config+ are placeholders, and
|
|
488
490
|
# calculate our own accordingly based on what's live in the cloud.
|
|
489
|
-
def toKitten(
|
|
491
|
+
def toKitten(**_args)
|
|
490
492
|
bok = {
|
|
491
493
|
"cloud" => "AWS",
|
|
492
494
|
"credentials" => @config['credentials'],
|
|
@@ -504,7 +506,7 @@ module MU
|
|
|
504
506
|
bok['tags'] ||= []
|
|
505
507
|
bok['tags'] << { "key" => tag.key, "value" => tag.value }
|
|
506
508
|
}
|
|
507
|
-
realname = MU::Adoption.tagsToName(bok['tags'])
|
|
509
|
+
realname = MU::Adoption.tagsToName(bok['tags'], basename: @cloud_id)
|
|
508
510
|
if realname
|
|
509
511
|
bok['name'] = realname
|
|
510
512
|
bok['name'].gsub!(/[^a-zA-Z0-9_\-]/, "_")
|
|
@@ -512,25 +514,56 @@ module MU
|
|
|
512
514
|
end
|
|
513
515
|
bok['name'] ||= @cloud_id
|
|
514
516
|
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
# id: cloud_desc.vpc_id,
|
|
518
|
-
# cloud: "AWS",
|
|
519
|
-
# credentials: @credentials,
|
|
520
|
-
# type: "vpcs",
|
|
521
|
-
# )
|
|
522
|
-
# end
|
|
517
|
+
bok['min_size'] = cloud_desc.min_size
|
|
518
|
+
bok['max_size'] = cloud_desc.max_size
|
|
523
519
|
|
|
524
|
-
|
|
520
|
+
if cloud_desc.launch_configuration_name
|
|
521
|
+
launch = MU::Cloud::AWS.autoscale(region: @config['region'], credentials: @credentials).describe_launch_configurations(
|
|
522
|
+
launch_configuration_names: [cloud_desc.launch_configuration_name]
|
|
523
|
+
).launch_configurations.first
|
|
524
|
+
bok['basis'] = {
|
|
525
|
+
"launch_config" => {
|
|
526
|
+
"image_id" => launch.image_id,
|
|
527
|
+
"name" => bok['name'],
|
|
528
|
+
"size" => launch.instance_type
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
end
|
|
532
|
+
|
|
533
|
+
if cloud_desc.vpc_zone_identifier and
|
|
534
|
+
!cloud_desc.vpc_zone_identifier.empty?
|
|
535
|
+
nets = cloud_desc.vpc_zone_identifier.split(/,/)
|
|
536
|
+
begin
|
|
537
|
+
resp = MU::Cloud::AWS.ec2(region: @config['region'], credentials: @credentials).describe_subnets(subnet_ids: nets).subnets.first
|
|
538
|
+
bok['vpc'] = MU::Config::Ref.get(
|
|
539
|
+
id: resp.vpc_id,
|
|
540
|
+
cloud: "AWS",
|
|
541
|
+
credentials: @credentials,
|
|
542
|
+
type: "vpcs",
|
|
543
|
+
subnets: nets.map { |s| { "subnet_id" => s } }
|
|
544
|
+
)
|
|
545
|
+
rescue Aws::EC2::Errors::InvalidSubnetIDNotFound => e
|
|
546
|
+
if e.message.match(/The subnet ID '(subnet-[a-f0-9]+)' does not exist/)
|
|
547
|
+
nets.delete(Regexp.last_match[1])
|
|
548
|
+
if nets.empty?
|
|
549
|
+
MU.log "Autoscale Group #{@cloud_id} was configured for a VPC, but the configuration held no valid subnets", MU::WARN, details: cloud_desc.vpc_zone_identifier.split(/,/)
|
|
550
|
+
end
|
|
551
|
+
else
|
|
552
|
+
raise e
|
|
553
|
+
end
|
|
554
|
+
end
|
|
555
|
+
end
|
|
556
|
+
|
|
557
|
+
# MU.log @cloud_id, MU::NOTICE, details: cloud_desc
|
|
525
558
|
|
|
526
559
|
bok
|
|
527
560
|
end
|
|
528
561
|
|
|
529
562
|
|
|
530
563
|
# Cloud-specific configuration properties.
|
|
531
|
-
# @param
|
|
564
|
+
# @param _config [MU::Config]: The calling MU::Config object
|
|
532
565
|
# @return [Array<Array,Hash>]: List of required fields, and json-schema Hash of cloud-specific configuration parameters for this resource
|
|
533
|
-
def self.schema(
|
|
566
|
+
def self.schema(_config)
|
|
534
567
|
toplevel_required = []
|
|
535
568
|
|
|
536
569
|
term_policies = MU::Cloud::AWS.credConfig ? MU::Cloud::AWS.autoscale.describe_termination_policy_types.termination_policy_types : ["AllocationStrategy", "ClosestToNextInstanceHour", "Default", "NewestInstance", "OldestInstance", "OldestLaunchConfiguration", "OldestLaunchTemplate"]
|
|
@@ -793,26 +826,7 @@ module MU
|
|
|
793
826
|
}
|
|
794
827
|
}
|
|
795
828
|
},
|
|
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
|
-
}
|
|
829
|
+
"ingress_rules" => MU::Cloud.resourceClass("AWS", "FirewallRule").ingressRuleAddtlSchema
|
|
816
830
|
}
|
|
817
831
|
[toplevel_required, schema]
|
|
818
832
|
end
|
|
@@ -846,7 +860,7 @@ module MU
|
|
|
846
860
|
next if !s[time]
|
|
847
861
|
begin
|
|
848
862
|
Time.parse(s[time])
|
|
849
|
-
rescue
|
|
863
|
+
rescue StandardError => e
|
|
850
864
|
MU.log "Failed to parse #{time} '#{s[time]}' in scheduled action for AutoScale group #{pool['name']}: #{e.message}", MU::ERR
|
|
851
865
|
ok = false
|
|
852
866
|
end
|
|
@@ -885,7 +899,7 @@ module MU
|
|
|
885
899
|
launch = pool["basis"]["launch_config"]
|
|
886
900
|
launch['iam_policies'] ||= pool['iam_policies']
|
|
887
901
|
|
|
888
|
-
launch['size'] = MU::Cloud
|
|
902
|
+
launch['size'] = MU::Cloud.resourceClass("AWS", "Server").validateInstanceType(launch["size"], pool["region"])
|
|
889
903
|
ok = false if launch['size'].nil?
|
|
890
904
|
if !launch['generate_iam_role']
|
|
891
905
|
if !launch['iam_role'] and pool['cloud'] != "CloudFormation"
|
|
@@ -929,11 +943,7 @@ module MU
|
|
|
929
943
|
|
|
930
944
|
role['credentials'] = pool['credentials'] if pool['credentials']
|
|
931
945
|
configurator.insertKitten(role, "roles")
|
|
932
|
-
pool["
|
|
933
|
-
pool["dependencies"] << {
|
|
934
|
-
"type" => "role",
|
|
935
|
-
"name" => pool["name"]
|
|
936
|
-
}
|
|
946
|
+
MU::Config.addDependency(pool, pool['name'], "role")
|
|
937
947
|
end
|
|
938
948
|
launch["ami_id"] ||= launch["image_id"]
|
|
939
949
|
if launch["server"].nil? and launch["instance_id"].nil? and launch["ami_id"].nil?
|
|
@@ -947,7 +957,7 @@ module MU
|
|
|
947
957
|
end
|
|
948
958
|
end
|
|
949
959
|
if launch["server"] != nil
|
|
950
|
-
pool["
|
|
960
|
+
MU::Config.addDependency(pool, launch["server"], "server", phase: "groom")
|
|
951
961
|
# XXX I dunno, maybe toss an error if this isn't done already
|
|
952
962
|
# servers.each { |server|
|
|
953
963
|
# if server["name"] == launch["server"]
|
|
@@ -1053,7 +1063,9 @@ module MU
|
|
|
1053
1063
|
# @param ignoremaster [Boolean]: If true, will remove resources not flagged as originating from this Mu server
|
|
1054
1064
|
# @param region [String]: The cloud provider region
|
|
1055
1065
|
# @return [void]
|
|
1056
|
-
def self.cleanup(noop: false, ignoremaster: false, region: MU.curRegion, credentials: nil, flags: {})
|
|
1066
|
+
def self.cleanup(noop: false, deploy_id: MU.deploy_id, ignoremaster: false, region: MU.curRegion, credentials: nil, flags: {})
|
|
1067
|
+
MU.log "AWS::ServerPool.cleanup: need to support flags['known']", MU::DEBUG, details: flags
|
|
1068
|
+
|
|
1057
1069
|
filters = [{name: "key", values: ["MU-ID"]}]
|
|
1058
1070
|
if !ignoremaster
|
|
1059
1071
|
filters << {name: "key", values: ["MU-MASTER-IP"]}
|
|
@@ -1074,7 +1086,7 @@ module MU
|
|
|
1074
1086
|
if asg.key == "MU-MASTER-IP" and asg.value != MU.mu_public_ip and !ignoremaster
|
|
1075
1087
|
no_purge << asg.resource_id
|
|
1076
1088
|
end
|
|
1077
|
-
if asg.key == "MU-ID" and asg.value ==
|
|
1089
|
+
if asg.key == "MU-ID" and asg.value == deploy_id
|
|
1078
1090
|
maybe_purge << asg.resource_id
|
|
1079
1091
|
end
|
|
1080
1092
|
}
|
|
@@ -1101,7 +1113,7 @@ module MU
|
|
|
1101
1113
|
end
|
|
1102
1114
|
end
|
|
1103
1115
|
|
|
1104
|
-
# MU::Cloud
|
|
1116
|
+
# MU::Cloud.resourceClass("AWS", "Server").removeIAMProfile(resource_id)
|
|
1105
1117
|
|
|
1106
1118
|
# Generally there should be a launch_configuration of the same name
|
|
1107
1119
|
# XXX search for these independently, too?
|
|
@@ -1134,7 +1146,6 @@ module MU
|
|
|
1134
1146
|
instance_secret = Password.random(50)
|
|
1135
1147
|
@deploy.saveNodeSecret("default", instance_secret, "instance_secret")
|
|
1136
1148
|
|
|
1137
|
-
nodes_name = @deploy.getResourceName(@config['basis']["launch_config"]["name"])
|
|
1138
1149
|
if !@config['basis']['launch_config']["server"].nil?
|
|
1139
1150
|
#XXX this isn't how we find these; use findStray or something
|
|
1140
1151
|
if @deploy.deployment["images"].nil? or @deploy.deployment["images"][@config['basis']['launch_config']["server"]].nil?
|
|
@@ -1143,14 +1154,14 @@ module MU
|
|
|
1143
1154
|
@config['basis']['launch_config']["ami_id"] = @deploy.deployment["images"][@config['basis']['launch_config']["server"]]["image_id"]
|
|
1144
1155
|
MU.log "Using AMI '#{@config['basis']['launch_config']["ami_id"]}' from sibling server #{@config['basis']['launch_config']["server"]} in ServerPool #{@mu_name}"
|
|
1145
1156
|
elsif !@config['basis']['launch_config']["instance_id"].nil?
|
|
1146
|
-
@config['basis']['launch_config']["ami_id"] = MU::Cloud
|
|
1157
|
+
@config['basis']['launch_config']["ami_id"] = MU::Cloud.resourceClass("AWS", "Server").createImage(
|
|
1147
1158
|
name: @mu_name,
|
|
1148
1159
|
instance_id: @config['basis']['launch_config']["instance_id"],
|
|
1149
1160
|
credentials: @config['credentials'],
|
|
1150
1161
|
region: @config['region']
|
|
1151
1162
|
)[@config['region']]
|
|
1152
1163
|
end
|
|
1153
|
-
MU::Cloud
|
|
1164
|
+
MU::Cloud.resourceClass("AWS", "Server").waitForAMI(@config['basis']['launch_config']["ami_id"], credentials: @config['credentials'])
|
|
1154
1165
|
|
|
1155
1166
|
oldlaunch = MU::Cloud::AWS.autoscale(region: @config['region'], credentials: @config['credentials']).describe_launch_configurations(
|
|
1156
1167
|
launch_configuration_names: [@mu_name]
|
|
@@ -1205,12 +1216,12 @@ module MU
|
|
|
1205
1216
|
vol.delete("encrypted")
|
|
1206
1217
|
end
|
|
1207
1218
|
end
|
|
1208
|
-
mapping,
|
|
1219
|
+
mapping, _cfm_mapping = MU::Cloud.resourceClass("AWS", "Server").convertBlockDeviceMapping(vol)
|
|
1209
1220
|
storage << mapping
|
|
1210
1221
|
}
|
|
1211
1222
|
end
|
|
1212
1223
|
|
|
1213
|
-
storage.concat(MU::Cloud
|
|
1224
|
+
storage.concat(MU::Cloud.resourceClass("AWS", "Server").ephemeral_mappings)
|
|
1214
1225
|
|
|
1215
1226
|
if @config['basis']['launch_config']['generate_iam_role']
|
|
1216
1227
|
role = @deploy.findLitterMate(name: @config['name'], type: "roles")
|
|
@@ -1322,7 +1333,7 @@ module MU
|
|
|
1322
1333
|
MU::Cloud::AWS.autoscale(region: @config['region'], credentials: @config['credentials']).create_launch_configuration(launch_options)
|
|
1323
1334
|
rescue Aws::AutoScaling::Errors::ValidationError => e
|
|
1324
1335
|
if lc_attempts > 3
|
|
1325
|
-
MU.log "Got error while creating #{@mu_name} Launch Config#{@config['credentials'] ? " with credentials #{@config['credentials']}" : ""}: #{e.message}, retrying in 10s", MU::WARN, details: launch_options.reject { |k,
|
|
1336
|
+
MU.log "Got error while creating #{@mu_name} Launch Config#{@config['credentials'] ? " with credentials #{@config['credentials']}" : ""}: #{e.message}, retrying in 10s", MU::WARN, details: launch_options.reject { |k,_v | k == :user_data }
|
|
1326
1337
|
end
|
|
1327
1338
|
sleep 5
|
|
1328
1339
|
lc_attempts += 1
|
|
@@ -1411,7 +1422,7 @@ module MU
|
|
|
1411
1422
|
if lb_name == lb['concurrent_load_balancer']
|
|
1412
1423
|
lbs << deployed_lb["awsname"] # XXX check for classic
|
|
1413
1424
|
if deployed_lb.has_key?("targetgroups")
|
|
1414
|
-
deployed_lb["targetgroups"].
|
|
1425
|
+
deployed_lb["targetgroups"].values.each { |tg_arn|
|
|
1415
1426
|
tg_arns << tg_arn
|
|
1416
1427
|
}
|
|
1417
1428
|
end
|
|
@@ -1464,7 +1475,6 @@ module MU
|
|
|
1464
1475
|
|
|
1465
1476
|
|
|
1466
1477
|
if @config['basis']["server"]
|
|
1467
|
-
nodes_name = @deploy.getResourceName(@config['basis']["server"])
|
|
1468
1478
|
srv_name = @config['basis']["server"]
|
|
1469
1479
|
# XXX cloudformation bits
|
|
1470
1480
|
if @deploy.deployment['servers'] != nil and
|
|
@@ -1473,7 +1483,6 @@ module MU
|
|
|
1473
1483
|
end
|
|
1474
1484
|
elsif @config['basis']["instance_id"]
|
|
1475
1485
|
# TODO should go fetch the name tag or something
|
|
1476
|
-
nodes_name = @deploy.getResourceName(@config['basis']["instance_id"].gsub(/-/, ""))
|
|
1477
1486
|
# XXX cloudformation bits
|
|
1478
1487
|
asg_options[:instance_id] = @config['basis']["instance_id"]
|
|
1479
1488
|
end
|
|
@@ -67,7 +67,7 @@ module MU
|
|
|
67
67
|
if target['vpc']["subnet_name"]
|
|
68
68
|
subnet_obj = vpc.getSubnet(name: target['vpc']["subnet_name"])
|
|
69
69
|
if subnet_obj.nil?
|
|
70
|
-
raise MuError, "Failed to locate subnet from #{
|
|
70
|
+
raise MuError, "Failed to locate subnet from #{target['vpc']["subnet_name"]} in StoragePool #{@config['name']}:#{target['name']}"
|
|
71
71
|
end
|
|
72
72
|
target['vpc']['subnet_id'] = subnet_obj.cloud_id
|
|
73
73
|
end
|
|
@@ -246,7 +246,7 @@ module MU
|
|
|
246
246
|
end
|
|
247
247
|
|
|
248
248
|
security_groups.uniq!
|
|
249
|
-
|
|
249
|
+
MU::Cloud::AWS.efs(region: region).modify_mount_target_security_groups(
|
|
250
250
|
mount_target_id: cloud_id,
|
|
251
251
|
security_groups: security_groups
|
|
252
252
|
)
|
|
@@ -254,7 +254,6 @@ module MU
|
|
|
254
254
|
|
|
255
255
|
# Register a description of this storage pool with this deployment's metadata.
|
|
256
256
|
def notify
|
|
257
|
-
deploy_struct = {}
|
|
258
257
|
storage_pool = MU::Cloud::AWS.efs(region: @config['region'], credentials: @config['credentials']).describe_file_systems(
|
|
259
258
|
creation_token: @mu_name
|
|
260
259
|
).file_systems.first
|
|
@@ -262,49 +261,29 @@ module MU
|
|
|
262
261
|
targets = {}
|
|
263
262
|
|
|
264
263
|
if @config['mount_points'] && !@config['mount_points'].empty?
|
|
264
|
+
mount_targets = MU::Cloud::AWS.efs(region: @config['region'], credentials: @config['credentials']).describe_mount_targets(
|
|
265
|
+
file_system_id: storage_pool.file_system_id
|
|
266
|
+
).mount_targets
|
|
267
|
+
|
|
265
268
|
@config['mount_points'].each { |mp|
|
|
266
269
|
subnet = nil
|
|
267
270
|
dependencies
|
|
268
|
-
mp_vpc =
|
|
269
|
-
@deploy.findLitterMate(type: "vpc", name: mp['vpc']['vpc_name'], credentials: @config['credentials'])
|
|
270
|
-
elsif mp['vpc']
|
|
271
|
-
MU::MommaCat.findStray(
|
|
272
|
-
@config['cloud'],
|
|
273
|
-
"vpcs",
|
|
274
|
-
deploy_id: mp['vpc']["deploy_id"],
|
|
275
|
-
credentials: @config['credentials'],
|
|
276
|
-
mu_name: mp['vpc']["mu_name"],
|
|
277
|
-
cloud_id: mp['vpc']['vpc_id'],
|
|
278
|
-
region: @config['region'],
|
|
279
|
-
dummy_ok: false
|
|
280
|
-
).first
|
|
281
|
-
# XXX non-sibling, findStray version
|
|
282
|
-
end
|
|
271
|
+
mp_vpc = MU::Config::Ref.get(mp['vpc']).kitten
|
|
283
272
|
|
|
284
|
-
mount_targets = MU::Cloud::AWS.efs(region: @config['region'], credentials: @config['credentials']).describe_mount_targets(
|
|
285
|
-
file_system_id: storage_pool.file_system_id
|
|
286
|
-
).mount_targets
|
|
287
273
|
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
274
|
+
subnet_obj = mp_vpc.subnets.select { |s|
|
|
275
|
+
s.name == mp["vpc"]["subnet_name"] or s.cloud_id == mp["vpc"]["subnet_id"]
|
|
276
|
+
}.first
|
|
291
277
|
mount_target = nil
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
}
|
|
300
|
-
break if mount_target
|
|
278
|
+
mount_targets.each { |t|
|
|
279
|
+
subnet_cidr_obj = NetAddr::IPv4Net.parse(subnet_obj.ip_block)
|
|
280
|
+
if subnet_cidr_obj.contains(NetAddr::IPv4.parse(t.ip_address))
|
|
281
|
+
mount_target = t
|
|
282
|
+
subnet = subnet_obj.cloud_desc
|
|
283
|
+
break
|
|
284
|
+
end
|
|
301
285
|
}
|
|
302
286
|
|
|
303
|
-
# mount_target = MU::Cloud::AWS.efs(region: @config['region'], credentials: @config['credentials']).describe_mount_targets(
|
|
304
|
-
# mount_target_id: mp["cloud_id"]
|
|
305
|
-
# ).mount_targets.first
|
|
306
|
-
|
|
307
|
-
|
|
308
287
|
targets[mp["name"]] = {
|
|
309
288
|
"owner_id" => mount_target.owner_id,
|
|
310
289
|
"cloud_id" => mount_target.mount_target_id,
|
|
@@ -354,7 +333,9 @@ module MU
|
|
|
354
333
|
# @param ignoremaster [Boolean]: If true, will remove resources not flagged as originating from this Mu server
|
|
355
334
|
# @param region [String]: The cloud provider region in which to operate
|
|
356
335
|
# @return [void]
|
|
357
|
-
def self.cleanup(noop: false, ignoremaster: false, region: MU.curRegion, credentials: nil, flags: {})
|
|
336
|
+
def self.cleanup(noop: false, deploy_id: MU.deploy_id, ignoremaster: false, region: MU.curRegion, credentials: nil, flags: {})
|
|
337
|
+
MU.log "AWS::StoragePool.cleanup: need to support flags['known']", MU::DEBUG, details: flags
|
|
338
|
+
|
|
358
339
|
supported_regions = %w{us-west-2 us-east-1 eu-west-1}
|
|
359
340
|
if supported_regions.include?(region)
|
|
360
341
|
begin
|
|
@@ -367,7 +348,6 @@ module MU
|
|
|
367
348
|
end
|
|
368
349
|
|
|
369
350
|
our_pools = []
|
|
370
|
-
our_replication_group_ids = []
|
|
371
351
|
|
|
372
352
|
if !storage_pools.empty?
|
|
373
353
|
storage_pools.each{ |pool|
|
|
@@ -378,7 +358,7 @@ module MU
|
|
|
378
358
|
found_muid = false
|
|
379
359
|
found_master = false
|
|
380
360
|
tags.each { |tag|
|
|
381
|
-
found_muid = true if tag.key == "MU-ID" && tag.value ==
|
|
361
|
+
found_muid = true if tag.key == "MU-ID" && tag.value == deploy_id
|
|
382
362
|
found_master = true if tag.key == "MU-MASTER-IP" && tag.value == MU.mu_public_ip
|
|
383
363
|
}
|
|
384
364
|
next if !found_muid
|
|
@@ -445,9 +425,9 @@ module MU
|
|
|
445
425
|
end
|
|
446
426
|
|
|
447
427
|
# Cloud-specific configuration properties.
|
|
448
|
-
# @param
|
|
428
|
+
# @param _config [MU::Config]: The calling MU::Config object
|
|
449
429
|
# @return [Array<Array,Hash>]: List of required fields, and json-schema Hash of cloud-specific configuration parameters for this resource
|
|
450
|
-
def self.schema(
|
|
430
|
+
def self.schema(_config)
|
|
451
431
|
toplevel_required = []
|
|
452
432
|
schema = {
|
|
453
433
|
"ingress_rules" => {
|
|
@@ -493,6 +473,9 @@ module MU
|
|
|
493
473
|
|
|
494
474
|
if pool['mount_points'] && !pool['mount_points'].empty?
|
|
495
475
|
pool['mount_points'].each{ |mp|
|
|
476
|
+
if mp['vpc'] and mp['vpc']['name']
|
|
477
|
+
MU::Config.addDependency(pool, mp['vpc']['name'], "vpc")
|
|
478
|
+
end
|
|
496
479
|
if mp['ingress_rules']
|
|
497
480
|
fwname = "storage-#{mp['name']}"
|
|
498
481
|
acl = {
|
|
@@ -515,7 +498,6 @@ module MU
|
|
|
515
498
|
ok
|
|
516
499
|
end
|
|
517
500
|
|
|
518
|
-
private
|
|
519
501
|
end #class
|
|
520
502
|
end #class
|
|
521
503
|
end
|