cloud-mu 3.1.2 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
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