cloud-mu 3.1.2 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) 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 +10 -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 +2 -3
  21. data/bin/mu-node-manage +15 -16
  22. data/bin/mu-run-tests +135 -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 +165 -111
  45. data/modules/mu/adoption.rb +401 -68
  46. data/modules/mu/cleanup.rb +199 -306
  47. data/modules/mu/cloud.rb +100 -1632
  48. data/modules/mu/cloud/database.rb +49 -0
  49. data/modules/mu/cloud/dnszone.rb +46 -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 +920 -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 +165 -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 +4 -4
  61. data/modules/mu/config/cache_cluster.rb +1 -1
  62. data/modules/mu/config/collection.rb +4 -4
  63. data/modules/mu/config/container_cluster.rb +9 -4
  64. data/modules/mu/config/database.rb +83 -104
  65. data/modules/mu/config/database.yml +1 -2
  66. data/modules/mu/config/dnszone.rb +6 -6
  67. data/modules/mu/config/doc_helpers.rb +516 -0
  68. data/modules/mu/config/endpoint.rb +4 -4
  69. data/modules/mu/config/firewall_rule.rb +103 -4
  70. data/modules/mu/config/folder.rb +4 -4
  71. data/modules/mu/config/function.rb +3 -3
  72. data/modules/mu/config/group.rb +4 -4
  73. data/modules/mu/config/habitat.rb +4 -4
  74. data/modules/mu/config/loadbalancer.rb +60 -14
  75. data/modules/mu/config/log.rb +4 -4
  76. data/modules/mu/config/msg_queue.rb +4 -4
  77. data/modules/mu/config/nosqldb.rb +4 -4
  78. data/modules/mu/config/notifier.rb +3 -3
  79. data/modules/mu/config/ref.rb +365 -0
  80. data/modules/mu/config/role.rb +4 -4
  81. data/modules/mu/config/schema_helpers.rb +509 -0
  82. data/modules/mu/config/search_domain.rb +4 -4
  83. data/modules/mu/config/server.rb +97 -70
  84. data/modules/mu/config/server.yml +1 -0
  85. data/modules/mu/config/server_pool.rb +5 -9
  86. data/modules/mu/config/storage_pool.rb +1 -1
  87. data/modules/mu/config/tail.rb +200 -0
  88. data/modules/mu/config/user.rb +4 -4
  89. data/modules/mu/config/vpc.rb +70 -27
  90. data/modules/mu/config/vpc.yml +0 -1
  91. data/modules/mu/defaults/AWS.yaml +83 -60
  92. data/modules/mu/defaults/Azure.yaml +1 -0
  93. data/modules/mu/defaults/Google.yaml +3 -2
  94. data/modules/mu/deploy.rb +30 -26
  95. data/modules/mu/groomer.rb +17 -2
  96. data/modules/mu/groomers/ansible.rb +188 -41
  97. data/modules/mu/groomers/chef.rb +116 -55
  98. data/modules/mu/logger.rb +127 -148
  99. data/modules/mu/master.rb +389 -2
  100. data/modules/mu/master/chef.rb +3 -4
  101. data/modules/mu/master/ldap.rb +3 -3
  102. data/modules/mu/master/ssl.rb +12 -3
  103. data/modules/mu/mommacat.rb +217 -2612
  104. data/modules/mu/mommacat/daemon.rb +397 -0
  105. data/modules/mu/mommacat/naming.rb +473 -0
  106. data/modules/mu/mommacat/search.rb +495 -0
  107. data/modules/mu/mommacat/storage.rb +722 -0
  108. data/modules/mu/{clouds → providers}/README.md +1 -1
  109. data/modules/mu/{clouds → providers}/aws.rb +271 -112
  110. data/modules/mu/{clouds → providers}/aws/alarm.rb +5 -3
  111. data/modules/mu/{clouds → providers}/aws/bucket.rb +26 -22
  112. data/modules/mu/{clouds → providers}/aws/cache_cluster.rb +33 -67
  113. data/modules/mu/{clouds → providers}/aws/collection.rb +24 -23
  114. data/modules/mu/{clouds → providers}/aws/container_cluster.rb +681 -721
  115. data/modules/mu/providers/aws/database.rb +1744 -0
  116. data/modules/mu/{clouds → providers}/aws/dnszone.rb +64 -63
  117. data/modules/mu/{clouds → providers}/aws/endpoint.rb +22 -27
  118. data/modules/mu/{clouds → providers}/aws/firewall_rule.rb +214 -244
  119. data/modules/mu/{clouds → providers}/aws/folder.rb +7 -7
  120. data/modules/mu/{clouds → providers}/aws/function.rb +17 -22
  121. data/modules/mu/{clouds → providers}/aws/group.rb +23 -23
  122. data/modules/mu/{clouds → providers}/aws/habitat.rb +17 -14
  123. data/modules/mu/{clouds → providers}/aws/loadbalancer.rb +57 -48
  124. data/modules/mu/{clouds → providers}/aws/log.rb +15 -12
  125. data/modules/mu/{clouds → providers}/aws/msg_queue.rb +17 -16
  126. data/modules/mu/{clouds → providers}/aws/nosqldb.rb +18 -11
  127. data/modules/mu/{clouds → providers}/aws/notifier.rb +11 -6
  128. data/modules/mu/{clouds → providers}/aws/role.rb +112 -86
  129. data/modules/mu/{clouds → providers}/aws/search_domain.rb +39 -33
  130. data/modules/mu/{clouds → providers}/aws/server.rb +835 -1133
  131. data/modules/mu/{clouds → providers}/aws/server_pool.rb +56 -60
  132. data/modules/mu/{clouds → providers}/aws/storage_pool.rb +24 -42
  133. data/modules/mu/{clouds → providers}/aws/user.rb +21 -22
  134. data/modules/mu/{clouds → providers}/aws/userdata/README.md +0 -0
  135. data/modules/mu/{clouds → providers}/aws/userdata/linux.erb +0 -0
  136. data/modules/mu/{clouds → providers}/aws/userdata/windows.erb +2 -1
  137. data/modules/mu/{clouds → providers}/aws/vpc.rb +523 -929
  138. data/modules/mu/providers/aws/vpc_subnet.rb +286 -0
  139. data/modules/mu/{clouds → providers}/azure.rb +29 -9
  140. data/modules/mu/{clouds → providers}/azure/container_cluster.rb +3 -8
  141. data/modules/mu/{clouds → providers}/azure/firewall_rule.rb +18 -11
  142. data/modules/mu/{clouds → providers}/azure/habitat.rb +8 -6
  143. data/modules/mu/{clouds → providers}/azure/loadbalancer.rb +5 -5
  144. data/modules/mu/{clouds → providers}/azure/role.rb +8 -10
  145. data/modules/mu/{clouds → providers}/azure/server.rb +95 -48
  146. data/modules/mu/{clouds → providers}/azure/user.rb +6 -8
  147. data/modules/mu/{clouds → providers}/azure/userdata/README.md +0 -0
  148. data/modules/mu/{clouds → providers}/azure/userdata/linux.erb +0 -0
  149. data/modules/mu/{clouds → providers}/azure/userdata/windows.erb +0 -0
  150. data/modules/mu/{clouds → providers}/azure/vpc.rb +16 -21
  151. data/modules/mu/{clouds → providers}/cloudformation.rb +18 -7
  152. data/modules/mu/{clouds → providers}/cloudformation/alarm.rb +3 -3
  153. data/modules/mu/{clouds → providers}/cloudformation/cache_cluster.rb +3 -3
  154. data/modules/mu/{clouds → providers}/cloudformation/collection.rb +3 -3
  155. data/modules/mu/{clouds → providers}/cloudformation/database.rb +6 -17
  156. data/modules/mu/{clouds → providers}/cloudformation/dnszone.rb +3 -3
  157. data/modules/mu/{clouds → providers}/cloudformation/firewall_rule.rb +3 -3
  158. data/modules/mu/{clouds → providers}/cloudformation/loadbalancer.rb +3 -3
  159. data/modules/mu/{clouds → providers}/cloudformation/log.rb +3 -3
  160. data/modules/mu/{clouds → providers}/cloudformation/server.rb +7 -7
  161. data/modules/mu/{clouds → providers}/cloudformation/server_pool.rb +5 -5
  162. data/modules/mu/{clouds → providers}/cloudformation/vpc.rb +5 -7
  163. data/modules/mu/{clouds → providers}/docker.rb +0 -0
  164. data/modules/mu/{clouds → providers}/google.rb +67 -30
  165. data/modules/mu/{clouds → providers}/google/bucket.rb +13 -15
  166. data/modules/mu/{clouds → providers}/google/container_cluster.rb +84 -77
  167. data/modules/mu/{clouds → providers}/google/database.rb +10 -20
  168. data/modules/mu/{clouds → providers}/google/firewall_rule.rb +15 -14
  169. data/modules/mu/{clouds → providers}/google/folder.rb +20 -17
  170. data/modules/mu/{clouds → providers}/google/function.rb +139 -167
  171. data/modules/mu/{clouds → providers}/google/group.rb +29 -34
  172. data/modules/mu/{clouds → providers}/google/habitat.rb +21 -22
  173. data/modules/mu/{clouds → providers}/google/loadbalancer.rb +18 -20
  174. data/modules/mu/{clouds → providers}/google/role.rb +92 -58
  175. data/modules/mu/{clouds → providers}/google/server.rb +242 -155
  176. data/modules/mu/{clouds → providers}/google/server_pool.rb +25 -44
  177. data/modules/mu/{clouds → providers}/google/user.rb +95 -31
  178. data/modules/mu/{clouds → providers}/google/userdata/README.md +0 -0
  179. data/modules/mu/{clouds → providers}/google/userdata/linux.erb +0 -0
  180. data/modules/mu/{clouds → providers}/google/userdata/windows.erb +0 -0
  181. data/modules/mu/{clouds → providers}/google/vpc.rb +103 -79
  182. data/modules/tests/bucket.yml +4 -0
  183. data/modules/tests/centos6.yaml +11 -0
  184. data/modules/tests/centos7.yaml +11 -0
  185. data/modules/tests/centos8.yaml +12 -0
  186. data/modules/tests/ecs.yaml +23 -0
  187. data/modules/tests/includes-and-params.yaml +2 -1
  188. data/modules/tests/rds.yaml +108 -0
  189. data/modules/tests/regrooms/aws-iam.yaml +201 -0
  190. data/modules/tests/regrooms/bucket.yml +19 -0
  191. data/modules/tests/regrooms/rds.yaml +123 -0
  192. data/modules/tests/server-with-scrub-muisms.yaml +1 -0
  193. data/modules/tests/super_simple_bok.yml +1 -3
  194. data/modules/tests/win2k12.yaml +17 -5
  195. data/modules/tests/win2k16.yaml +25 -0
  196. data/modules/tests/win2k19.yaml +25 -0
  197. data/requirements.txt +1 -0
  198. data/spec/mu/clouds/azure_spec.rb +2 -2
  199. metadata +232 -154
  200. data/extras/image-generators/AWS/windows.yaml +0 -18
  201. data/modules/mu/clouds/aws/database.rb +0 -1985
@@ -53,7 +53,6 @@ module MU
53
53
  def groom
54
54
 
55
55
  if @config['peers']
56
- count = 0
57
56
  @config['peers'].each { |peer|
58
57
  if peer['vpc']['name']
59
58
  peer_obj = @deploy.findLitterMate(name: peer['vpc']['name'], type: "vpcs", habitat: peer['vpc']['project'])
@@ -113,17 +112,16 @@ module MU
113
112
  # Describe this VPC
114
113
  # @return [Hash]
115
114
  def notify
116
- base = {}
117
115
  base = MU.structToHash(cloud_desc)
118
116
  base["cloud_id"] = @cloud_id.name
119
117
  base.merge!(@config.to_h)
120
118
  base
121
119
  end
122
- #
120
+
123
121
  # Describe this VPC from the cloud platform's perspective
124
122
  # @return [Hash]
125
- def cloud_desc
126
- if @cloud_desc_cache
123
+ def cloud_desc(use_cache: true)
124
+ if @cloud_desc_cache and use_cache
127
125
  return @cloud_desc_cache
128
126
  end
129
127
  @cloud_desc_cache = MU::Cloud::Azure::VPC.find(cloud_id: @cloud_id, resource_group: @resource_group).values.first
@@ -192,10 +190,9 @@ module MU
192
190
  # @param use_cache [Boolean]: If available, use saved deployment metadata to describe subnets, instead of querying the cloud API
193
191
  # @return [Array<Hash>]: A list of cloud provider identifiers of subnets associated with this VPC.
194
192
  def loadSubnets(use_cache: false)
195
- desc = cloud_desc
196
193
  @subnets = []
197
194
 
198
- MU::Cloud::Azure.network(credentials: @credentials).subnets.list(@resource_group, cloud_desc.name).each { |subnet|
195
+ MU::Cloud::Azure.network(credentials: @credentials).subnets.list(@resource_group, cloud_desc(use_cache: use_cache).name).each { |subnet|
199
196
  subnet_cfg = {
200
197
  "cloud_id" => subnet.name,
201
198
  "mu_name" => subnet.name,
@@ -334,21 +331,23 @@ module MU
334
331
  # We assume that any values we have in +@config+ are placeholders, and
335
332
  # calculate our own accordingly based on what's live in the cloud.
336
333
  # XXX add flag to return the diff between @config and live cloud
337
- def toKitten(rootparent: nil, billing: nil)
334
+ def toKitten(**_args)
338
335
  return nil if cloud_desc.name == "default" # parent project builds these
339
336
  bok = {
340
337
  "cloud" => "Azure",
338
+ "name" => cloud_desc.name,
341
339
  "project" => @config['project'],
342
- "credentials" => @config['credentials']
340
+ "credentials" => @config['credentials'],
341
+ "cloud_id" => @cloud_id.to_s
343
342
  }
344
343
 
345
344
  bok
346
345
  end
347
346
 
348
347
  # Cloud-specific configuration properties.
349
- # @param config [MU::Config]: The calling MU::Config object
348
+ # @param _config [MU::Config]: The calling MU::Config object
350
349
  # @return [Array<Array,Hash>]: List of required fields, and json-schema Hash of cloud-specific configuration parameters for this resource
351
- def self.schema(config = nil)
350
+ def self.schema(_config = nil)
352
351
  toplevel_required = []
353
352
  schema = {
354
353
  "peers" => {
@@ -427,11 +426,7 @@ module MU
427
426
  }
428
427
  ]
429
428
  }
430
- vpc["dependencies"] ||= []
431
- vpc["dependencies"] << {
432
- "type" => "firewall_rule",
433
- "name" => vpc['name']+"-defaultfw"
434
- }
429
+ MU::Config.addDependency(vpc, vpc['name']+"-defaultfw", "firewall_rule")
435
430
 
436
431
  if !configurator.insertKitten(default_acl, "firewall_rules", true)
437
432
  ok = false
@@ -522,7 +517,6 @@ MU.structToHash(ext_vpc).diff(MU.structToHash(vpc_obj))
522
517
  # this is slow, so maybe thread it
523
518
  rtb_map = {}
524
519
  routethreads = []
525
- create_nat_gateway = false
526
520
  @config['route_tables'].each { |rtb_cfg|
527
521
  routethreads << Thread.new(rtb_cfg) { |rtb|
528
522
  rtb_name = @mu_name+"-"+rtb['name'].upcase
@@ -573,6 +567,9 @@ MU.structToHash(ext_vpc).diff(MU.structToHash(vpc_obj))
573
567
  routename = rtb_name+"-"+route['destination_network'].gsub(/[^a-z0-9]/i, "_")
574
568
  route_obj.next_hop_type = if route['gateway'] == "#NAT" and @config['bastion']
575
569
  routename = rtb_name+"-NAT"
570
+ if @config['bastion'].is_a?(Hash) and !@config['bastion']['id'] and !@config['bastion']['deploy_id']
571
+ @config['bastion']['deploy_id'] = @deploy.deploy_id
572
+ end
576
573
  bastion_ref = MU::Config::Ref.get(@config['bastion'])
577
574
  if bastion_ref.kitten and bastion_ref.kitten.cloud_desc
578
575
  iface_id = Id.new(bastion_ref.kitten.cloud_desc.network_profile.network_interfaces.first.id)
@@ -718,8 +715,6 @@ MU.structToHash(ext_subnet).diff(MU.structToHash(subnet_obj))
718
715
  loadSubnets
719
716
  end
720
717
 
721
- protected
722
-
723
718
  # Subnets are almost a first-class resource. So let's kinda sorta treat
724
719
  # them like one. This should only be invoked on objects that already
725
720
  # exists in the cloud layer.
@@ -772,8 +767,8 @@ MU.structToHash(ext_subnet).diff(MU.structToHash(subnet_obj))
772
767
  end
773
768
 
774
769
  # Describe this VPC Subnet from the cloud platform's perspective
775
- def cloud_desc
776
- return @cloud_desc_cache if !@cloud_desc_cache.nil?
770
+ def cloud_desc(use_cache: true)
771
+ return @cloud_desc_cache if @cloud_desc_cache and use_cache
777
772
  @cloud_desc_cache = MU::Cloud::Azure.network(credentials: @parent.credentials).subnets.get(@parent.resource_group, @parent.cloud_desc.name, @cloud_id.to_s)
778
773
  @cloud_desc_cache
779
774
  end
@@ -28,6 +28,16 @@ module MU
28
28
 
29
29
  @@cloudformation_mode = false
30
30
 
31
+ # Is this a "real" cloud provider, or a stub like CloudFormation?
32
+ def self.virtual?
33
+ true
34
+ end
35
+
36
+ # List all AWS projects available to our credentials
37
+ def self.listHabitats(credentials = nil, use_cache: true)
38
+ MU::Cloud::AWS.listHabitats(credentials)
39
+ end
40
+
31
41
  # Return what we think of as a cloud object's habitat. In AWS, this means
32
42
  # the +account_number+ in which it's resident. If this is not applicable,
33
43
  # such as for a {Habitat} or {Folder}, returns nil.
@@ -73,8 +83,8 @@ module MU
73
83
  # Stub method- there's no such thing as being "hosted" in a CloudFormation
74
84
  # environment. Calls {MU::Cloud::AWS.listAZs} to return sensible
75
85
  # values, if we happen to have AWS credentials configured.
76
- def self.listAZs(region: MU.curRegion, account: nil, credentials: nil)
77
- MU::Cloud::AWS.listAZs(region: region, account: account, credentials: credentials)
86
+ def self.listAZs(region: MU.curRegion, credentials: nil)
87
+ MU::Cloud::AWS.listAZs(region: region, credentials: credentials)
78
88
  end
79
89
 
80
90
  # Stub method- there's no such thing as being "hosted" in a CloudFormation
@@ -466,7 +476,7 @@ module MU
466
476
  desc["DependsOn"] = []
467
477
  if !cloudobj.nil? and cloudobj.respond_to?(:dependencies) and type != "subnet"
468
478
  cloudobj.dependencies(use_cache: true).first.each_pair { |resource_classname, resources|
469
- resources.each_pair { |sibling_name, sibling_obj|
479
+ resources.each_pair { |_sibling_name, sibling_obj|
470
480
  next if sibling_obj == cloudobj
471
481
  # desc["DependsOn"] << (resource_classname+sibling_obj.cloudobj.mu_name).gsub!(/[^a-z0-9]/i, "")
472
482
  desc["DependsOn"] << sibling_obj.cloudobj.cfm_name
@@ -498,7 +508,6 @@ module MU
498
508
  # @param name [String]: The name of key we're creating/appending
499
509
  # @param value [MU::Config::Tail|String]: The value to set. If it's a {MU::Config::Tail} object, we'll treat it as a reference to a parameter.
500
510
  def self.setCloudFormationProp(resource, name, value)
501
- realvalue = value
502
511
  is_list_element = false
503
512
 
504
513
  # Recursively resolve MU::Config::Tail references
@@ -508,9 +517,11 @@ module MU
508
517
  tree[key] = self.resolveTails(val)
509
518
  }
510
519
  elsif tree.is_a?(Array)
520
+ newtree = []
511
521
  tree.each { |elt|
512
- elt = self.resolveTails(elt)
522
+ newtree << self.resolveTails(elt)
513
523
  }
524
+ tree = newtree
514
525
  elsif tree.class.to_s == "MU::Config::Tail"
515
526
  if tree.is_list_element
516
527
  return { "Fn::Select" => [tree.index, { "Ref" => "#{tree.getPrettyName}" }] }
@@ -584,7 +595,7 @@ module MU
584
595
  cfm_template["Conditions"][cond['name']] = JSON.parse(cond['cloudcode'])
585
596
  }
586
597
  end
587
- tails.each_pair { |param, data|
598
+ tails.each_pair { |_param, data|
588
599
  tail = data
589
600
  next if tail.is_a?(MU::Config::Tail) and (tail.pseudo or !tail.runtimecode.nil?)
590
601
  default = ""
@@ -638,7 +649,7 @@ module MU
638
649
  }
639
650
  end
640
651
  }
641
- MU::Cloud.resource_types.each { |cloudclass, data|
652
+ MU::Cloud.resource_types.values.each { |data|
642
653
  if !config[data[:cfg_plural]].nil? and
643
654
  config[data[:cfg_plural]].size > 0
644
655
  config[data[:cfg_plural]].each { |resource|
@@ -129,7 +129,7 @@ module MU
129
129
  # @param config [MU::Config]: The calling MU::Config object
130
130
  # @return [Array<Array,Hash>]: List of required fields, and json-schema Hash of cloud-specific configuration parameters for this resource
131
131
  def self.schema(config)
132
- MU::Cloud::AWS::Alarm.schema(config)
132
+ MU::Cloud.resourceClass("AWS", "Alarm").schema(config)
133
133
  end
134
134
 
135
135
  # Cloud-specific pre-processing of {MU::Config::BasketofKittens::servers}, bare and unvalidated.
@@ -137,14 +137,14 @@ module MU
137
137
  # @param configurator [MU::Config]: The overall deployment configurator of which this resource is a member
138
138
  # @return [Boolean]: True if validation succeeded, False otherwise
139
139
  def self.validateConfig(server, configurator)
140
- MU::Cloud::AWS::Alarm.validateConfig(server, configurator)
140
+ MU::Cloud.resourceClass("AWS", "Alarm").validateConfig(server, configurator)
141
141
  end
142
142
 
143
143
  # Does this resource type exist as a global (cloud-wide) artifact, or
144
144
  # is it localized to a region/zone?
145
145
  # @return [Boolean]
146
146
  def self.isGlobal?
147
- MU::Cloud::AWS::Alarm.isGlobal?
147
+ MU::Cloud.resourceClass("AWS", "Alarm").isGlobal?
148
148
  end
149
149
 
150
150
 
@@ -150,7 +150,7 @@ module MU
150
150
  # @param config [MU::Config]: The calling MU::Config object
151
151
  # @return [Array<Array,Hash>]: List of required fields, and json-schema Hash of cloud-specific configuration parameters for this resource
152
152
  def self.schema(config)
153
- MU::Cloud::AWS::CacheCluster.schema(config)
153
+ MU::Cloud.resourceClass("AWS", "CacheCluster").schema(config)
154
154
  end
155
155
 
156
156
  # Cloud-specific pre-processing of {MU::Config::BasketofKittens::servers}, bare and unvalidated.
@@ -158,14 +158,14 @@ module MU
158
158
  # @param configurator [MU::Config]: The overall deployment configurator of which this resource is a member
159
159
  # @return [Boolean]: True if validation succeeded, False otherwise
160
160
  def self.validateConfig(server, configurator)
161
- MU::Cloud::AWS::CacheCluster.validateConfig(server, configurator)
161
+ MU::Cloud.resourceClass("AWS", "CacheCluster").validateConfig(server, configurator)
162
162
  end
163
163
 
164
164
  # Does this resource type exist as a global (cloud-wide) artifact, or
165
165
  # is it localized to a region/zone?
166
166
  # @return [Boolean]
167
167
  def self.isGlobal?
168
- MU::Cloud::AWS::CacheCluster.isGlobal?
168
+ MU::Cloud.resourceClass("AWS", "CacheCluster").isGlobal?
169
169
  end
170
170
 
171
171
  end
@@ -100,7 +100,7 @@ module MU
100
100
  # @param config [MU::Config]: The calling MU::Config object
101
101
  # @return [Array<Array,Hash>]: List of required fields, and json-schema Hash of cloud-specific configuration parameters for this resource
102
102
  def self.schema(config)
103
- MU::Cloud::AWS::Collection.schema(config)
103
+ MU::Cloud.resourceClass("AWS", "Collection").schema(config)
104
104
  end
105
105
 
106
106
  # Cloud-specific pre-processing of {MU::Config::BasketofKittens::servers}, bare and unvalidated.
@@ -108,14 +108,14 @@ module MU
108
108
  # @param configurator [MU::Config]: The overall deployment configurator of which this resource is a member
109
109
  # @return [Boolean]: True if validation succeeded, False otherwise
110
110
  def self.validateConfig(server, configurator)
111
- MU::Cloud::AWS::Collection.validateConfig(server, configurator)
111
+ MU::Cloud.resourceClass("AWS", "Collection").validateConfig(server, configurator)
112
112
  end
113
113
 
114
114
  # Does this resource type exist as a global (cloud-wide) artifact, or
115
115
  # is it localized to a region/zone?
116
116
  # @return [Boolean]
117
117
  def self.isGlobal?
118
- MU::Cloud::AWS::Collection.isGlobal?
118
+ MU::Cloud.resourceClass("AWS", "Collection").isGlobal?
119
119
  end
120
120
 
121
121
  end
@@ -64,8 +64,8 @@ module MU
64
64
  basename = @config["name"].to_s
65
65
  basename = basename+@deploy.timestamp+MU.seed.downcase if !@config['scrub_mu_isms']
66
66
  basename.gsub!(/[^a-z0-9]/i, "")
67
- @config["db_name"] = MU::Cloud::AWS::Database.getName(basename, type: "dbname", config: @config)
68
- @config['master_user'] = MU::Cloud::AWS::Database.getName(basename, type: "dbuser", config: @config)
67
+ @config["db_name"] = MU::Cloud.resourceClass("AWS", "Database").getName(basename, type: "dbname", config: @config)
68
+ @config['master_user'] = MU::Cloud.resourceClass("AWS", "Database").getName(basename, type: "dbuser", config: @config)
69
69
 
70
70
  if @config["create_cluster"]
71
71
  @cfm_name, @cfm_template = MU::Cloud::CloudFormation.cloudFormationBase("dbcluster", self, tags: @config['tags'], scrub_mu_isms: @config['scrub_mu_isms']) if @cfm_template.nil?
@@ -214,18 +214,7 @@ module MU
214
214
  elsif @config['db_name']
215
215
  MU::Cloud::CloudFormation.setCloudFormationProp(@cfm_template[@cfm_name], "DBName", @config['db_name'])
216
216
  end
217
- if @config['password'].nil?
218
- if @config['auth_vault'] && !@config['auth_vault'].empty?
219
- @config['password'] = @groomclass.getSecret(
220
- vault: @config['auth_vault']['vault'],
221
- item: @config['auth_vault']['item'],
222
- field: @config['auth_vault']['password_field']
223
- )
224
- else
225
- # Should we use random instead?
226
- @config['password'] = Password.pronounceable(10..12)
227
- end
228
- end
217
+ getPassword
229
218
  MU::Cloud::CloudFormation.setCloudFormationProp(@cfm_template[@cfm_name], "MasterUserPassword", @config['password'])
230
219
  end
231
220
  end
@@ -260,7 +249,7 @@ module MU
260
249
  # @param config [MU::Config]: The calling MU::Config object
261
250
  # @return [Array<Array,Hash>]: List of required fields, and json-schema Hash of cloud-specific configuration parameters for this resource
262
251
  def self.schema(config)
263
- MU::Cloud::AWS::Database.schema(config)
252
+ MU::Cloud.resourceClass("AWS", "Database").schema(config)
264
253
  end
265
254
 
266
255
  # Cloud-specific pre-processing of {MU::Config::BasketofKittens::servers}, bare and unvalidated.
@@ -268,14 +257,14 @@ module MU
268
257
  # @param configurator [MU::Config]: The overall deployment configurator of which this resource is a member
269
258
  # @return [Boolean]: True if validation succeeded, False otherwise
270
259
  def self.validateConfig(server, configurator)
271
- MU::Cloud::AWS::Database.validateConfig(server, configurator)
260
+ MU::Cloud.resourceClass("AWS", "Database").validateConfig(server, configurator)
272
261
  end
273
262
 
274
263
  # Does this resource type exist as a global (cloud-wide) artifact, or
275
264
  # is it localized to a region/zone?
276
265
  # @return [Boolean]
277
266
  def self.isGlobal?
278
- MU::Cloud::AWS::Database.isGlobal?
267
+ MU::Cloud.resourceClass("AWS", "Database").isGlobal?
279
268
  end
280
269
 
281
270
 
@@ -257,7 +257,7 @@ module MU
257
257
  # @param config [MU::Config]: The calling MU::Config object
258
258
  # @return [Array<Array,Hash>]: List of required fields, and json-schema Hash of cloud-specific configuration parameters for this resource
259
259
  def self.schema(config)
260
- MU::Cloud::AWS::DNSZone.schema(config)
260
+ MU::Cloud.resourceClass("AWS", "DNSZone").schema(config)
261
261
  end
262
262
 
263
263
  # Cloud-specific pre-processing of {MU::Config::BasketofKittens::servers}, bare and unvalidated.
@@ -265,14 +265,14 @@ module MU
265
265
  # @param configurator [MU::Config]: The overall deployment configurator of which this resource is a member
266
266
  # @return [Boolean]: True if validation succeeded, False otherwise
267
267
  def self.validateConfig(server, configurator)
268
- MU::Cloud::AWS::DNSZone.validateConfig(server, configurator)
268
+ MU::Cloud.resourceClass("AWS", "DNSZone").validateConfig(server, configurator)
269
269
  end
270
270
 
271
271
  # Does this resource type exist as a global (cloud-wide) artifact, or
272
272
  # is it localized to a region/zone?
273
273
  # @return [Boolean]
274
274
  def self.isGlobal?
275
- MU::Cloud::AWS::DNSZone.isGlobal?
275
+ MU::Cloud.resourceClass("AWS", "DNSZone").isGlobal?
276
276
  end
277
277
 
278
278
  end
@@ -137,7 +137,7 @@ module MU
137
137
  # @return [Boolean]: True if validation succeeded, False otherwise
138
138
  def self.validateConfig(acl, config)
139
139
  # Just use the AWS implemention
140
- MU::Cloud::AWS::FirewallRule.validateConfig(acl, config)
140
+ MU::Cloud.resourceClass("AWS", "FirewallRule").validateConfig(acl, config)
141
141
  end
142
142
 
143
143
  private
@@ -291,14 +291,14 @@ module MU
291
291
  # @param config [MU::Config]: The calling MU::Config object
292
292
  # @return [Array<Array,Hash>]: List of required fields, and json-schema Hash of cloud-specific configuration parameters for this resource
293
293
  def self.schema(config)
294
- MU::Cloud::AWS::FirewallRule.schema(config)
294
+ MU::Cloud.resourceClass("AWS", "FirewallRule").schema(config)
295
295
  end
296
296
 
297
297
  # Does this resource type exist as a global (cloud-wide) artifact, or
298
298
  # is it localized to a region/zone?
299
299
  # @return [Boolean]
300
300
  def self.isGlobal?
301
- MU::Cloud::AWS::FirewallRule.isGlobal?
301
+ MU::Cloud.resourceClass("AWS", "FirewallRule").isGlobal?
302
302
  end
303
303
 
304
304
  end #class
@@ -176,7 +176,7 @@ module MU
176
176
  # @param config [MU::Config]: The calling MU::Config object
177
177
  # @return [Array<Array,Hash>]: List of required fields, and json-schema Hash of cloud-specific configuration parameters for this resource
178
178
  def self.schema(config)
179
- MU::Cloud::AWS::LoadBalancer.schema(config)
179
+ MU::Cloud.resourceClass("AWS", "LoadBalancer").schema(config)
180
180
  end
181
181
 
182
182
  # Cloud-specific pre-processing of {MU::Config::BasketofKittens::servers}, bare and unvalidated.
@@ -184,14 +184,14 @@ module MU
184
184
  # @param configurator [MU::Config]: The overall deployment configurator of which this resource is a member
185
185
  # @return [Boolean]: True if validation succeeded, False otherwise
186
186
  def self.validateConfig(server, configurator)
187
- MU::Cloud::AWS::LoadBalancer.validateConfig(server, configurator)
187
+ MU::Cloud.resourceClass("AWS", "LoadBalancer").validateConfig(server, configurator)
188
188
  end
189
189
 
190
190
  # Does this resource type exist as a global (cloud-wide) artifact, or
191
191
  # is it localized to a region/zone?
192
192
  # @return [Boolean]
193
193
  def self.isGlobal?
194
- MU::Cloud::AWS::LoadBalancer.isGlobal?
194
+ MU::Cloud.resourceClass("AWS", "LoadBalancer").isGlobal?
195
195
  end
196
196
 
197
197
  end
@@ -153,7 +153,7 @@ module MU
153
153
  # @param config [MU::Config]: The calling MU::Config object
154
154
  # @return [Array<Array,Hash>]: List of required fields, and json-schema Hash of cloud-specific configuration parameters for this resource
155
155
  def self.schema(config)
156
- MU::Cloud::AWS::Log.schema(config)
156
+ MU::Cloud.resourceClass("AWS", "Log").schema(config)
157
157
  end
158
158
 
159
159
  # Cloud-specific pre-processing of {MU::Config::BasketofKittens::servers}, bare and unvalidated.
@@ -161,14 +161,14 @@ module MU
161
161
  # @param configurator [MU::Config]: The overall deployment configurator of which this resource is a member
162
162
  # @return [Boolean]: True if validation succeeded, False otherwise
163
163
  def self.validateConfig(server, configurator)
164
- MU::Cloud::AWS::Log.validateConfig(server, configurator)
164
+ MU::Cloud.resourceClass("AWS", "Log").validateConfig(server, configurator)
165
165
  end
166
166
 
167
167
  # Does this resource type exist as a global (cloud-wide) artifact, or
168
168
  # is it localized to a region/zone?
169
169
  # @return [Boolean]
170
170
  def self.isGlobal?
171
- MU::Cloud::AWS::Log.isGlobal?
171
+ MU::Cloud.resourceClass("AWS", "Log").isGlobal?
172
172
  end
173
173
 
174
174
  end
@@ -55,8 +55,8 @@ module MU
55
55
  scrub_mu_isms: @config['scrub_mu_isms']
56
56
  )
57
57
 
58
- @disk_devices = MU::Cloud::AWS::Server.disk_devices
59
- @ephemeral_mappings = MU::Cloud::AWS::Server.ephemeral_mappings
58
+ @disk_devices = MU::Cloud.resourceClass("AWS", "Server").disk_devices
59
+ @ephemeral_mappings = MU::Cloud.resourceClass("AWS", "Server").ephemeral_mappings
60
60
 
61
61
  if !mu_name.nil?
62
62
  @mu_name = mu_name
@@ -190,7 +190,7 @@ module MU
190
190
  cfm_volume_map = {}
191
191
  if @config["storage"]
192
192
  @config["storage"].each { |vol|
193
- mapping, cfm_mapping = MU::Cloud::AWS::Server.convertBlockDeviceMapping(vol)
193
+ mapping, cfm_mapping = MU::Cloud.resourceClass("AWS", "Server").convertBlockDeviceMapping(vol)
194
194
  configured_storage << mapping
195
195
  # vol_name, vol_template = MU::Cloud::CloudFormation.cloudFormationBase("volume", name: "volume"+@cfm_name+mapping[:device_name])
196
196
  # MU::Cloud::CloudFormation.setCloudFormationProp(vol_template[vol_name], "Size", mapping[:ebs][:volume_size].to_s)
@@ -353,7 +353,7 @@ module MU
353
353
  # @param config [MU::Config]: The calling MU::Config object
354
354
  # @return [Array<Array,Hash>]: List of required fields, and json-schema Hash of cloud-specific configuration parameters for this resource
355
355
  def self.schema(config)
356
- MU::Cloud::AWS::Server.schema(config)
356
+ MU::Cloud.resourceClass("AWS", "Server").schema(config)
357
357
  end
358
358
 
359
359
  # Confirm that the given instance size is valid for the given region.
@@ -362,7 +362,7 @@ module MU
362
362
  # @param region [String]: Region to check against
363
363
  # @return [String,nil]
364
364
  def self.validateInstanceType(size, region)
365
- MU::Cloud::AWS::Server.validateInstanceType(size, region)
365
+ MU::Cloud.resourceClass("AWS", "Server").validateInstanceType(size, region)
366
366
  end
367
367
 
368
368
  # Cloud-specific pre-processing of {MU::Config::BasketofKittens::servers}, bare and unvalidated.
@@ -370,14 +370,14 @@ module MU
370
370
  # @param configurator [MU::Config]: The overall deployment configurator of which this resource is a member
371
371
  # @return [Boolean]: True if validation succeeded, False otherwise
372
372
  def self.validateConfig(server, configurator)
373
- MU::Cloud::AWS::Server.validateConfig(server, configurator)
373
+ MU::Cloud.resourceClass("AWS", "Server").validateConfig(server, configurator)
374
374
  end
375
375
 
376
376
  # Does this resource type exist as a global (cloud-wide) artifact, or
377
377
  # is it localized to a region/zone?
378
378
  # @return [Boolean]
379
379
  def self.isGlobal?
380
- MU::Cloud::AWS::Server.isGlobal?
380
+ MU::Cloud.resourceClass("AWS", "Server").isGlobal?
381
381
  end
382
382
 
383
383
  end #class