cloud-mu 3.1.3 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +15 -3
  3. data/ansible/roles/mu-windows/README.md +33 -0
  4. data/ansible/roles/mu-windows/defaults/main.yml +2 -0
  5. data/ansible/roles/mu-windows/files/LaunchConfig.json +9 -0
  6. data/ansible/roles/mu-windows/files/config.xml +76 -0
  7. data/ansible/roles/mu-windows/handlers/main.yml +2 -0
  8. data/ansible/roles/mu-windows/meta/main.yml +53 -0
  9. data/ansible/roles/mu-windows/tasks/main.yml +36 -0
  10. data/ansible/roles/mu-windows/tests/inventory +2 -0
  11. data/ansible/roles/mu-windows/tests/test.yml +5 -0
  12. data/ansible/roles/mu-windows/vars/main.yml +2 -0
  13. data/bin/mu-adopt +21 -13
  14. data/bin/mu-azure-tests +57 -0
  15. data/bin/mu-cleanup +2 -4
  16. data/bin/mu-configure +52 -0
  17. data/bin/mu-deploy +3 -3
  18. data/bin/mu-findstray-tests +25 -0
  19. data/bin/mu-gen-docs +2 -4
  20. data/bin/mu-load-config.rb +4 -4
  21. data/bin/mu-node-manage +15 -16
  22. data/bin/mu-run-tests +147 -37
  23. data/cloud-mu.gemspec +22 -20
  24. data/cookbooks/mu-activedirectory/resources/domain.rb +4 -4
  25. data/cookbooks/mu-activedirectory/resources/domain_controller.rb +4 -4
  26. data/cookbooks/mu-tools/libraries/helper.rb +3 -2
  27. data/cookbooks/mu-tools/libraries/monkey.rb +35 -0
  28. data/cookbooks/mu-tools/recipes/apply_security.rb +14 -14
  29. data/cookbooks/mu-tools/recipes/aws_api.rb +9 -0
  30. data/cookbooks/mu-tools/recipes/eks.rb +2 -2
  31. data/cookbooks/mu-tools/recipes/google_api.rb +2 -2
  32. data/cookbooks/mu-tools/recipes/selinux.rb +2 -1
  33. data/cookbooks/mu-tools/recipes/windows-client.rb +163 -164
  34. data/cookbooks/mu-tools/resources/disk.rb +1 -1
  35. data/cookbooks/mu-tools/resources/windows_users.rb +44 -43
  36. data/extras/clean-stock-amis +25 -19
  37. data/extras/generate-stock-images +1 -0
  38. data/extras/image-generators/AWS/win2k12.yaml +18 -13
  39. data/extras/image-generators/AWS/win2k16.yaml +18 -13
  40. data/extras/image-generators/AWS/win2k19.yaml +21 -0
  41. data/extras/image-generators/Google/centos6.yaml +1 -0
  42. data/extras/image-generators/Google/centos7.yaml +1 -1
  43. data/modules/mommacat.ru +6 -16
  44. data/modules/mu.rb +158 -111
  45. data/modules/mu/adoption.rb +404 -71
  46. data/modules/mu/cleanup.rb +221 -306
  47. data/modules/mu/cloud.rb +129 -1633
  48. data/modules/mu/cloud/database.rb +49 -0
  49. data/modules/mu/cloud/dnszone.rb +44 -0
  50. data/modules/mu/cloud/machine_images.rb +212 -0
  51. data/modules/mu/cloud/providers.rb +81 -0
  52. data/modules/mu/cloud/resource_base.rb +926 -0
  53. data/modules/mu/cloud/server.rb +40 -0
  54. data/modules/mu/cloud/server_pool.rb +1 -0
  55. data/modules/mu/cloud/ssh_sessions.rb +228 -0
  56. data/modules/mu/cloud/winrm_sessions.rb +237 -0
  57. data/modules/mu/cloud/wrappers.rb +169 -0
  58. data/modules/mu/config.rb +171 -1767
  59. data/modules/mu/config/alarm.rb +2 -6
  60. data/modules/mu/config/bucket.rb +32 -3
  61. data/modules/mu/config/cache_cluster.rb +2 -2
  62. data/modules/mu/config/cdn.rb +100 -0
  63. data/modules/mu/config/collection.rb +4 -4
  64. data/modules/mu/config/container_cluster.rb +9 -4
  65. data/modules/mu/config/database.rb +84 -105
  66. data/modules/mu/config/database.yml +1 -2
  67. data/modules/mu/config/dnszone.rb +10 -9
  68. data/modules/mu/config/doc_helpers.rb +516 -0
  69. data/modules/mu/config/endpoint.rb +5 -4
  70. data/modules/mu/config/firewall_rule.rb +103 -4
  71. data/modules/mu/config/folder.rb +4 -4
  72. data/modules/mu/config/function.rb +19 -10
  73. data/modules/mu/config/group.rb +4 -4
  74. data/modules/mu/config/habitat.rb +4 -4
  75. data/modules/mu/config/job.rb +89 -0
  76. data/modules/mu/config/loadbalancer.rb +60 -14
  77. data/modules/mu/config/log.rb +4 -4
  78. data/modules/mu/config/msg_queue.rb +4 -4
  79. data/modules/mu/config/nosqldb.rb +4 -4
  80. data/modules/mu/config/notifier.rb +10 -21
  81. data/modules/mu/config/ref.rb +411 -0
  82. data/modules/mu/config/role.rb +4 -4
  83. data/modules/mu/config/schema_helpers.rb +509 -0
  84. data/modules/mu/config/search_domain.rb +4 -4
  85. data/modules/mu/config/server.rb +98 -71
  86. data/modules/mu/config/server.yml +1 -0
  87. data/modules/mu/config/server_pool.rb +5 -9
  88. data/modules/mu/config/storage_pool.rb +1 -1
  89. data/modules/mu/config/tail.rb +200 -0
  90. data/modules/mu/config/user.rb +4 -4
  91. data/modules/mu/config/vpc.rb +71 -27
  92. data/modules/mu/config/vpc.yml +0 -1
  93. data/modules/mu/defaults/AWS.yaml +91 -68
  94. data/modules/mu/defaults/Azure.yaml +1 -0
  95. data/modules/mu/defaults/Google.yaml +3 -2
  96. data/modules/mu/deploy.rb +43 -26
  97. data/modules/mu/groomer.rb +17 -2
  98. data/modules/mu/groomers/ansible.rb +188 -41
  99. data/modules/mu/groomers/chef.rb +116 -55
  100. data/modules/mu/logger.rb +127 -148
  101. data/modules/mu/master.rb +410 -2
  102. data/modules/mu/master/chef.rb +3 -4
  103. data/modules/mu/master/ldap.rb +3 -3
  104. data/modules/mu/master/ssl.rb +12 -3
  105. data/modules/mu/mommacat.rb +218 -2612
  106. data/modules/mu/mommacat/daemon.rb +403 -0
  107. data/modules/mu/mommacat/naming.rb +473 -0
  108. data/modules/mu/mommacat/search.rb +495 -0
  109. data/modules/mu/mommacat/storage.rb +722 -0
  110. data/modules/mu/{clouds → providers}/README.md +1 -1
  111. data/modules/mu/{clouds → providers}/aws.rb +380 -122
  112. data/modules/mu/{clouds → providers}/aws/alarm.rb +7 -5
  113. data/modules/mu/{clouds → providers}/aws/bucket.rb +297 -59
  114. data/modules/mu/{clouds → providers}/aws/cache_cluster.rb +37 -71
  115. data/modules/mu/providers/aws/cdn.rb +782 -0
  116. data/modules/mu/{clouds → providers}/aws/collection.rb +26 -25
  117. data/modules/mu/{clouds → providers}/aws/container_cluster.rb +724 -744
  118. data/modules/mu/providers/aws/database.rb +1744 -0
  119. data/modules/mu/{clouds → providers}/aws/dnszone.rb +88 -70
  120. data/modules/mu/providers/aws/endpoint.rb +1072 -0
  121. data/modules/mu/{clouds → providers}/aws/firewall_rule.rb +220 -247
  122. data/modules/mu/{clouds → providers}/aws/folder.rb +8 -8
  123. data/modules/mu/{clouds → providers}/aws/function.rb +300 -142
  124. data/modules/mu/{clouds → providers}/aws/group.rb +31 -29
  125. data/modules/mu/{clouds → providers}/aws/habitat.rb +18 -15
  126. data/modules/mu/providers/aws/job.rb +466 -0
  127. data/modules/mu/{clouds → providers}/aws/loadbalancer.rb +66 -56
  128. data/modules/mu/{clouds → providers}/aws/log.rb +17 -14
  129. data/modules/mu/{clouds → providers}/aws/msg_queue.rb +29 -19
  130. data/modules/mu/{clouds → providers}/aws/nosqldb.rb +114 -16
  131. data/modules/mu/{clouds → providers}/aws/notifier.rb +142 -65
  132. data/modules/mu/{clouds → providers}/aws/role.rb +158 -118
  133. data/modules/mu/{clouds → providers}/aws/search_domain.rb +201 -59
  134. data/modules/mu/{clouds → providers}/aws/server.rb +844 -1139
  135. data/modules/mu/{clouds → providers}/aws/server_pool.rb +74 -65
  136. data/modules/mu/{clouds → providers}/aws/storage_pool.rb +26 -44
  137. data/modules/mu/{clouds → providers}/aws/user.rb +24 -25
  138. data/modules/mu/{clouds → providers}/aws/userdata/README.md +0 -0
  139. data/modules/mu/{clouds → providers}/aws/userdata/linux.erb +5 -4
  140. data/modules/mu/{clouds → providers}/aws/userdata/windows.erb +2 -1
  141. data/modules/mu/{clouds → providers}/aws/vpc.rb +525 -931
  142. data/modules/mu/providers/aws/vpc_subnet.rb +286 -0
  143. data/modules/mu/{clouds → providers}/azure.rb +29 -9
  144. data/modules/mu/{clouds → providers}/azure/container_cluster.rb +3 -8
  145. data/modules/mu/{clouds → providers}/azure/firewall_rule.rb +18 -11
  146. data/modules/mu/{clouds → providers}/azure/habitat.rb +8 -6
  147. data/modules/mu/{clouds → providers}/azure/loadbalancer.rb +5 -5
  148. data/modules/mu/{clouds → providers}/azure/role.rb +8 -10
  149. data/modules/mu/{clouds → providers}/azure/server.rb +97 -49
  150. data/modules/mu/{clouds → providers}/azure/user.rb +6 -8
  151. data/modules/mu/{clouds → providers}/azure/userdata/README.md +0 -0
  152. data/modules/mu/{clouds → providers}/azure/userdata/linux.erb +0 -0
  153. data/modules/mu/{clouds → providers}/azure/userdata/windows.erb +0 -0
  154. data/modules/mu/{clouds → providers}/azure/vpc.rb +16 -21
  155. data/modules/mu/{clouds → providers}/cloudformation.rb +18 -7
  156. data/modules/mu/{clouds → providers}/cloudformation/alarm.rb +3 -3
  157. data/modules/mu/{clouds → providers}/cloudformation/cache_cluster.rb +3 -3
  158. data/modules/mu/{clouds → providers}/cloudformation/collection.rb +3 -3
  159. data/modules/mu/{clouds → providers}/cloudformation/database.rb +6 -17
  160. data/modules/mu/{clouds → providers}/cloudformation/dnszone.rb +3 -3
  161. data/modules/mu/{clouds → providers}/cloudformation/firewall_rule.rb +3 -3
  162. data/modules/mu/{clouds → providers}/cloudformation/loadbalancer.rb +3 -3
  163. data/modules/mu/{clouds → providers}/cloudformation/log.rb +3 -3
  164. data/modules/mu/{clouds → providers}/cloudformation/server.rb +7 -7
  165. data/modules/mu/{clouds → providers}/cloudformation/server_pool.rb +5 -5
  166. data/modules/mu/{clouds → providers}/cloudformation/vpc.rb +5 -7
  167. data/modules/mu/{clouds → providers}/docker.rb +0 -0
  168. data/modules/mu/{clouds → providers}/google.rb +68 -30
  169. data/modules/mu/{clouds → providers}/google/bucket.rb +13 -15
  170. data/modules/mu/{clouds → providers}/google/container_cluster.rb +85 -78
  171. data/modules/mu/{clouds → providers}/google/database.rb +11 -21
  172. data/modules/mu/{clouds → providers}/google/firewall_rule.rb +15 -14
  173. data/modules/mu/{clouds → providers}/google/folder.rb +20 -17
  174. data/modules/mu/{clouds → providers}/google/function.rb +140 -168
  175. data/modules/mu/{clouds → providers}/google/group.rb +29 -34
  176. data/modules/mu/{clouds → providers}/google/habitat.rb +21 -22
  177. data/modules/mu/{clouds → providers}/google/loadbalancer.rb +19 -21
  178. data/modules/mu/{clouds → providers}/google/role.rb +94 -58
  179. data/modules/mu/{clouds → providers}/google/server.rb +243 -156
  180. data/modules/mu/{clouds → providers}/google/server_pool.rb +26 -45
  181. data/modules/mu/{clouds → providers}/google/user.rb +95 -31
  182. data/modules/mu/{clouds → providers}/google/userdata/README.md +0 -0
  183. data/modules/mu/{clouds → providers}/google/userdata/linux.erb +0 -0
  184. data/modules/mu/{clouds → providers}/google/userdata/windows.erb +0 -0
  185. data/modules/mu/{clouds → providers}/google/vpc.rb +103 -79
  186. data/modules/tests/aws-jobs-functions.yaml +46 -0
  187. data/modules/tests/bucket.yml +4 -0
  188. data/modules/tests/centos6.yaml +15 -0
  189. data/modules/tests/centos7.yaml +15 -0
  190. data/modules/tests/centos8.yaml +12 -0
  191. data/modules/tests/ecs.yaml +23 -0
  192. data/modules/tests/eks.yaml +1 -1
  193. data/modules/tests/functions/node-function/lambda_function.js +10 -0
  194. data/modules/tests/functions/python-function/lambda_function.py +12 -0
  195. data/modules/tests/includes-and-params.yaml +2 -1
  196. data/modules/tests/microservice_app.yaml +288 -0
  197. data/modules/tests/rds.yaml +108 -0
  198. data/modules/tests/regrooms/aws-iam.yaml +201 -0
  199. data/modules/tests/regrooms/bucket.yml +19 -0
  200. data/modules/tests/regrooms/rds.yaml +123 -0
  201. data/modules/tests/server-with-scrub-muisms.yaml +2 -1
  202. data/modules/tests/super_complex_bok.yml +2 -2
  203. data/modules/tests/super_simple_bok.yml +3 -5
  204. data/modules/tests/win2k12.yaml +17 -5
  205. data/modules/tests/win2k16.yaml +25 -0
  206. data/modules/tests/win2k19.yaml +25 -0
  207. data/requirements.txt +1 -0
  208. data/spec/mu/clouds/azure_spec.rb +2 -2
  209. metadata +240 -154
  210. data/extras/image-generators/AWS/windows.yaml +0 -18
  211. data/modules/mu/clouds/aws/database.rb +0 -1985
  212. data/modules/mu/clouds/aws/endpoint.rb +0 -592
@@ -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 Exception => e
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::AWS::Server.terminateInstance(id: member.instance_id)
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
- if me and me.first and me.first.instances
198
- me.first.instances.each { |instance|
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::MommaCat.createTag(instance.instance_id, t[:key], t[:value], region: @config['region'], credentials: @config['credentials'])
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
- resp = MU::Cloud::AWS.autoscale(region: @config['region'], credentials: @config['credentials']).put_scaling_policy(policy_params)
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
- MU::Cloud::AWS.autoscale(region: @config['region'], credentials: @config['credentials']).describe_auto_scaling_groups(
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(rootparent: nil, billing: nil, habitats: nil)
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
- # if cloud_desc.vpc_id
516
- # bok['vpc'] = MU::Config::Ref.get(
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
- MU.log @cloud_id, MU::NOTICE, details: cloud_desc
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 config [MU::Config]: The calling MU::Config object
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(config)
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 Exception => e
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::AWS::Server.validateInstanceType(launch["size"], pool["region"])
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["dependencies"] ||= []
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["dependencies"] << {"type" => "server", "name" => launch["server"]}
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 == MU.deploy_id
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::AWS::Server.removeIAMProfile(resource_id)
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::AWS::Server.createImage(
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::AWS::Server.waitForAMI(@config['basis']['launch_config']["ami_id"], credentials: @config['credentials'])
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, cfm_mapping = MU::Cloud::AWS::Server.convertBlockDeviceMapping(vol)
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::AWS::Server.ephemeral_mappings)
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,v | k == :user_data }
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"].each_pair { |tg_name, tg_arn|
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 #{subnet} in StoragePool #{@config['name']}:#{target['name']}"
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
- resp = MU::Cloud::AWS.efs(region: region).modify_mount_target_security_groups(
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 = if mp['vpc'] and mp['vpc']['vpc_name']
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
- # subnet_obj = mp_vpc.subnets.select { |s|
289
- # s.name == mp["vpc"]["subnet_name"] or s.cloud_id == mp["vpc"]["subnet_id"]
290
- # }.first
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
- mp_vpc.subnets.each { |subnet_obj|
293
- mount_targets.map { |t|
294
- subnet_cidr_obj = NetAddr::IPv4Net.parse(subnet_obj.ip_block)
295
- if subnet_cidr_obj.contains(NetAddr::IPv4.parse(t.ip_address))
296
- mount_target = t
297
- subnet = subnet_obj.cloud_desc
298
- end
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 == MU.deploy_id
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 config [MU::Config]: The calling MU::Config object
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(config)
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