cloud-mu 2.0.0.pre.beta2 → 2.0.0.pre.beta3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/Berksfile.lock +1 -1
  3. data/cloud-mu.gemspec +4 -3
  4. data/cookbooks/mu-master/templates/default/mu.rc.erb +2 -2
  5. data/cookbooks/mu-tools/files/default/Mu_CA.pem +18 -19
  6. data/cookbooks/mu-tools/recipes/rsyslog.rb +1 -1
  7. data/modules/mu/cleanup.rb +14 -1
  8. data/modules/mu/cloud.rb +40 -22
  9. data/modules/mu/clouds/aws/alarm.rb +6 -0
  10. data/modules/mu/clouds/aws/bucket.rb +29 -0
  11. data/modules/mu/clouds/aws/cache_cluster.rb +6 -0
  12. data/modules/mu/clouds/aws/container_cluster.rb +6 -0
  13. data/modules/mu/clouds/aws/database.rb +6 -0
  14. data/modules/mu/clouds/aws/dnszone.rb +6 -0
  15. data/modules/mu/clouds/aws/endpoint.rb +6 -0
  16. data/modules/mu/clouds/aws/firewall_rule.rb +6 -0
  17. data/modules/mu/clouds/aws/folder.rb +6 -0
  18. data/modules/mu/clouds/aws/function.rb +6 -0
  19. data/modules/mu/clouds/aws/group.rb +6 -0
  20. data/modules/mu/clouds/aws/loadbalancer.rb +6 -0
  21. data/modules/mu/clouds/aws/log.rb +6 -0
  22. data/modules/mu/clouds/aws/msg_queue.rb +6 -0
  23. data/modules/mu/clouds/aws/nosqldb.rb +6 -0
  24. data/modules/mu/clouds/aws/notifier.rb +6 -0
  25. data/modules/mu/clouds/aws/role.rb +97 -11
  26. data/modules/mu/clouds/aws/search_domain.rb +6 -0
  27. data/modules/mu/clouds/aws/server.rb +6 -0
  28. data/modules/mu/clouds/aws/server_pool.rb +6 -0
  29. data/modules/mu/clouds/aws/storage_pool.rb +6 -0
  30. data/modules/mu/clouds/aws/user.rb +6 -0
  31. data/modules/mu/clouds/aws/vpc.rb +25 -1
  32. data/modules/mu/clouds/google.rb +86 -16
  33. data/modules/mu/clouds/google/bucket.rb +78 -3
  34. data/modules/mu/clouds/google/container_cluster.rb +12 -0
  35. data/modules/mu/clouds/google/database.rb +15 -1
  36. data/modules/mu/clouds/google/firewall_rule.rb +18 -2
  37. data/modules/mu/clouds/google/folder.rb +183 -16
  38. data/modules/mu/clouds/google/group.rb +7 -1
  39. data/modules/mu/clouds/google/habitat.rb +139 -24
  40. data/modules/mu/clouds/google/loadbalancer.rb +26 -12
  41. data/modules/mu/clouds/google/server.rb +25 -10
  42. data/modules/mu/clouds/google/server_pool.rb +16 -3
  43. data/modules/mu/clouds/google/user.rb +7 -1
  44. data/modules/mu/clouds/google/vpc.rb +87 -76
  45. data/modules/mu/config.rb +12 -0
  46. data/modules/mu/config/bucket.rb +4 -0
  47. data/modules/mu/config/folder.rb +1 -0
  48. data/modules/mu/config/habitat.rb +1 -1
  49. data/modules/mu/config/role.rb +78 -34
  50. data/modules/mu/config/vpc.rb +1 -0
  51. data/modules/mu/groomers/chef.rb +1 -1
  52. data/modules/mu/kittens.rb +689 -283
  53. metadata +5 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 565d062e93b6512b12c242ebc5bdf3c53f3d12d269ae2586b3d77d412eff8844
4
- data.tar.gz: c2ffd33d778e0962fe94ec2fdbffa36a5db7d1d9f81754e4f4fa2fb301aace14
3
+ metadata.gz: cec0ccf09208e41e9134e3c91298505d6e0166f5f08ff6bc36be3b470bbb99e9
4
+ data.tar.gz: 67af0a4e21700506873ae591641acd7c4272c524cfe61b62f87e5bae98ec2423
5
5
  SHA512:
6
- metadata.gz: 45d7bb74d8f5de582fc51264b3f58b2e01dd45ee55829a187d3a66e3ea700552b17fe73f9259bb834e1af72379979586cc31066d837826281a1daf073f52006e
7
- data.tar.gz: 2409873627fed8e0710264cf73b5a821120558d7f8d3e536e140a5939866fdd8393bdb7b41ce7f3ba0da709cacf288d1b1f1ba1ebaae8b6967842262cd03c13d
6
+ metadata.gz: ef03c420882a307a26ef726dde97c40f571e21d7ec03727f3b28c10480da770c898a2edee1c30301f1178596a19c6bc0cc724d6a8ad43c44d75835321387f28e
7
+ data.tar.gz: 0db7d823010c03a83da7040e50286321aed63967c8519e9e5b4791086fb0cf6c0ef63d56d45edb4e57c67fa49288c16feda14281611e42b5c3013fbbc905829e
@@ -88,7 +88,7 @@ GRAPH
88
88
  mu-master (>= 0.0.0)
89
89
  mu-tools (>= 0.0.0)
90
90
  mu-utility (>= 0.0.0)
91
- mu-master (0.9.2)
91
+ mu-master (0.9.3)
92
92
  apache2 (< 4.0)
93
93
  bind (~> 2.2.0)
94
94
  bind9-ng (~> 0.1.0)
@@ -17,7 +17,7 @@ end
17
17
 
18
18
  Gem::Specification.new do |s|
19
19
  s.name = 'cloud-mu'
20
- s.version = '2.0.0-beta2'
20
+ s.version = '2.0.0-beta3'
21
21
  s.date = '2019-03-01'
22
22
  s.require_paths = ['modules']
23
23
  s.required_ruby_version = '>= 2.4'
@@ -27,7 +27,8 @@ The eGTLabs Mu toolkit for unified cloud deployments. This gem contains a minima
27
27
 
28
28
  It will attempt to autodetect when it's being run in a virtual machine on a known cloud provider and activate the appropriate API with machine-based credentials. Installing this gem on an Amazon Web Service instance, for example, should automatically enable the MU::Cloud::AWS layer and attempt to use the machine's IAM Profile to communicate with the AWS API.
29
29
 
30
- require 'mu'
30
+
31
+ require 'cloud-mu'
31
32
 
32
33
 
33
34
  EOF
@@ -57,7 +58,7 @@ EOF
57
58
  s.add_runtime_dependency 'net-ssh', "~> 4.2"
58
59
  s.add_runtime_dependency 'net-ssh-multi', '~> 1.2', '>= 1.2.1'
59
60
  s.add_runtime_dependency 'googleauth', "~> 0.6"
60
- s.add_runtime_dependency 'google-api-client', "~> 0.25"
61
+ s.add_runtime_dependency 'google-api-client', "~> 0.28.4"
61
62
  s.add_runtime_dependency 'rubocop', '~> 0.58'
62
63
  s.add_runtime_dependency 'addressable', '~> 2.5'
63
64
  s.add_runtime_dependency 'slack-notifier', "~> 2.3"
@@ -2,8 +2,8 @@
2
2
  # user. Regular users get a .murc installed by mu-user-manage, from the template
3
3
  # in <%= @installdir %>/lib/install/user-dot-murc.erb
4
4
  export PATH="<%= @installdir %>/bin:/usr/local/ruby-current/bin:${PATH}:/opt/opscode/embedded/bin"
5
- #export MU_INSTALLDIR="<%= @installdir %>"
6
- #export MU_DATADIR="<%= @installdir %>/var"
5
+ export MU_INSTALLDIR="<%= @installdir %>"
6
+ export MU_DATADIR="<%= @installdir %>/var"
7
7
 
8
8
  alias vi=vim
9
9
  export EDITOR=vim
@@ -1,8 +1,8 @@
1
1
  -----BEGIN CERTIFICATE-----
2
- MIIF2zCCA8OgAwIBAgIJAOx2Krw2HGFkMA0GCSqGSIb3DQEBDQUAMF0xFjAUBgNV
2
+ MIIFvzCCA6egAwIBAgIJAKAgqiKox1coMA0GCSqGSIb3DQEBDQUAMF0xFjAUBgNV
3
3
  BAMMDTU0LjE3NS44Ni4xOTQxIDAeBgNVBAsMF011IFNlcnZlciA1NC4xNzUuODYu
4
- MTk0MRQwEgYDVQQKDAtlR2xvYmFsVGVjaDELMAkGA1UEBhMCVVMwHhcNMTkwMjI3
5
- MTQ0ODA2WhcNMjExMjE3MTQ0ODA2WjBdMRYwFAYDVQQDDA01NC4xNzUuODYuMTk0
4
+ MTk0MRQwEgYDVQQKDAtlR2xvYmFsVGVjaDELMAkGA1UEBhMCVVMwHhcNMTkwMzEx
5
+ MTk1MzA4WhcNMjExMjI5MTk1MzA4WjBdMRYwFAYDVQQDDA01NC4xNzUuODYuMTk0
6
6
  MSAwHgYDVQQLDBdNdSBTZXJ2ZXIgNTQuMTc1Ljg2LjE5NDEUMBIGA1UECgwLZUds
7
7
  b2JhbFRlY2gxCzAJBgNVBAYTAlVTMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
8
8
  CgKCAgEAo7rntOFj/WPNvh00SN55aJBusppsY9arq7QF5gt/9+cBPsjcXn7jJMu0
@@ -15,20 +15,19 @@ PO/6Svt8zTH3pEJMbxwtiwJ8cCLiqSoxj8hOKvvsSmvboN9DwN73JQjOY/pXHaU1
15
15
  HLF0qlnfZhU4uiE8+wU1h6oeGZG9fLV63wlGdUXA+HermzovuJ0d2ocy0O93QQDt
16
16
  Y92dr6UcPfAmzFyX3Rj9FFMYb2/n1G8l5pEd/Qkx3sH04aoxEmyQU0zugo3zQsL9
17
17
  KNyIbp2BTlSh2R/4hWJpWiXFliRvotiJu1s2wdNQ1D3SZgxDbfxf/3j04xgdi5eW
18
- e4Q3VnxhRfmkS1NqEzIvPabVLg9qvN419cubpE6HAtBJw/f3ocUCAwEAAaOBnTCB
19
- mjBKBgNVHREEQzBBhwQ2r1bCgglsb2NhbGhvc3SHBH8AAAGCGXN0YW5nZS1tdS1k
20
- ZXYucGxhdGZvcm0tbXWCDXN0YW5nZS1tdS1kZXYwHQYDVR0OBBYEFK/EmtGebCwd
21
- 5QpM8y/3EKdYNVbcMB8GA1UdIwQYMBaAFK/EmtGebCwd5QpM8y/3EKdYNVbcMAwG
22
- A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQENBQADggIBACrhE0wT4DBanIUiWNU74e5k
23
- tH4DC2vOfdPuF7AOFpDDmvR7HHoztWMyV7+KjrsQy/khAWNDq+JJ9Ya1E7mo9Jhy
24
- w3Ty9xM1FfA39D1dXoGFhfG++HbQSqVXvVWmwa4M/9VmL5YgqCkeEiRf8WQ7TpjT
25
- ldQUovcIICRAkeZG/lqjHJ/jAADIepCbsOeP0Gs2T0jdLmN2jKkcwFZkqpEi8PQB
26
- wyhtJvUyU/B7xVBI5etrqmwxApg5RmkmnnsBXAxtSnJP1SvLv0o1IQZfOKzR9Ivn
27
- IAJaXAp9q2AecHMQhu6TMpNCgifLKcwsGBlmrL+6wgU6+AedWYl80iewzk2kYrEw
28
- MpIRETKBEOOsIo0jaNzdK/SyxdBtol7T9s6cwGXSr2n06Vtqvwc5d94gqgZyGBgg
29
- GYnBVfVvRTxGP+2rHry1DRPLlr4/pwzo1XkCPb4QViaYL3jtuQUrj3a6EZZJnS4V
30
- c9U7RFY8t9uGuIhHN8ZzeZyF0TaAwsMJtkvriRt2rK5BoBn5n6273QOey1YmqnfW
31
- Xh919XQbuEha1XMG0xRD2RYURJjfSFV81humvQ2vSfZZqZplieXI98TOStRN6cmn
32
- RE0Zx1kpQ5VVsukYCvQYZ1FzR2PmtOum4IrWQJRWdK8k7hrW+b9YzFDlcimf4Yiv
33
- uaxTeq345Wu1zn+Pj9AI
18
+ e4Q3VnxhRfmkS1NqEzIvPabVLg9qvN419cubpE6HAtBJw/f3ocUCAwEAAaOBgTB/
19
+ MC8GA1UdEQQoMCaHBDavVsKCCWxvY2FsaG9zdIcEfwAAAYINc3RhbmdlLW11LWRl
20
+ djAdBgNVHQ4EFgQUr8Sa0Z5sLB3lCkzzL/cQp1g1VtwwHwYDVR0jBBgwFoAUr8Sa
21
+ 0Z5sLB3lCkzzL/cQp1g1VtwwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQ0FAAOC
22
+ AgEAYtAARdgURxiZ+GaX9R9vpxEjF0NS8cF4k6Z02FKLQV0uO8r1xuv/KA3K2uWd
23
+ huy5IYsN/0q9EtcMWyrKhAOLV92V2y6pojZDLN3R8CYkgoi7HVBALkp3LIwCVyK6
24
+ vY3V0n3op67vWtPNV/lpvSYDb0thUS/SNWk1o7VQxgBYEhV8lTgWKwUN3ViZIS7a
25
+ X4hY47q8pd4f8YztNE7ov56sQBcOFK9ZY0x/96eXWrsLlNdQ85g/6Lzc3jIKrKpd
26
+ dpWMybnEpWSAS6gi6OcUX4JT6K32nQdKvFRZmYl4227BvMODr+iZCBordzUaMp/G
27
+ 9nHM8xgUVWwb8asDExtpOELTznZmBMnn5yosv6cklASGWcX0DwJPo2f/BlPKg46E
28
+ DHIncJf9WBR1dMYyOT+W0L/IsuArmijXnwWNx5p6KhK81nV/ziTOy/6aD2uRlCPv
29
+ FjcjWlhWIgCsUdYA1K4uTb2oM/i52tqT3h9/Qh3EYQYu+X5UB1lx1FQyUZJ6LsUi
30
+ jRHjvITtRAsmZ7l2uP6Ms1lYMfOcaHziKFrbsmppm6eVP1FWG3LEkLxK7/ydZEwa
31
+ SSRenqB4VZJ3ISG/0znidOhntq1AC1UnAazR53CTvDE357aSa49bj9MQADJWNOaB
32
+ mKsEWh4Sg0OOOpQpaS5W7e0beogUz0QybmPitzwlyhzTM/4=
34
33
  -----END CERTIFICATE-----
@@ -32,7 +32,7 @@ if !node['application_attributes']['skip_recipes'].include?('rsyslog')
32
32
  if platform_family?("rhel")
33
33
  $rsyslog_ssl_ca_path = "/etc/pki/Mu_CA.pem"
34
34
  if !platform?("amazon")
35
- package "policycoreutils-python"
35
+ package node['platform_version'].to_i < 6 ? "policycoreutils" : "policycoreutils-python"
36
36
  execute "allow rsyslog to meddle with port 10514" do
37
37
  command "/usr/sbin/semanage port -a -t syslogd_port_t -p tcp 10514"
38
38
  not_if "/usr/sbin/semanage port -l | grep '^syslog.*10514'"
@@ -61,7 +61,7 @@ module MU
61
61
  end
62
62
 
63
63
 
64
- types_in_order = ["Collection", "Endpoint", "Function", "ServerPool", "ContainerCluster", "SearchDomain", "Server", "MsgQueue", "Database", "CacheCluster", "StoragePool", "LoadBalancer", "NoSQLDB", "FirewallRule", "Alarm", "Notifier", "Log", "VPC", "Role", "Group", "User", "Bucket", "DNSZone", "Collection", "Habitat"]
64
+ types_in_order = ["Collection", "Endpoint", "Function", "ServerPool", "ContainerCluster", "SearchDomain", "Server", "MsgQueue", "Database", "CacheCluster", "StoragePool", "LoadBalancer", "NoSQLDB", "FirewallRule", "Alarm", "Notifier", "Log", "VPC", "Role", "Group", "User", "Bucket", "DNSZone", "Collection", "Habitat", "Folder"]
65
65
 
66
66
  # Load up our deployment metadata
67
67
  if !mommacat.nil?
@@ -160,6 +160,19 @@ module MU
160
160
  end
161
161
 
162
162
  if @mommacat.nil? or @mommacat.numKittens(types: [t]) > 0
163
+ if @mommacat
164
+ found = @mommacat.findLitterMate(type: t, return_all: true, credentials: credset)
165
+ flags['known'] ||= []
166
+ if found.is_a?(Array)
167
+ found.each { |k|
168
+ flags['known'] << k.cloud_id
169
+ }
170
+ elsif found and found.is_a?(Hash)
171
+ flags['known'] << found['cloud_id']
172
+ elsif found
173
+ flags['known'] << found.cloud_id
174
+ end
175
+ end
163
176
  begin
164
177
  resclass = Object.const_get("MU").const_get("Cloud").const_get(t)
165
178
  resclass.cleanup(
@@ -126,10 +126,44 @@ module MU
126
126
  class NoSQLDB;
127
127
  end
128
128
 
129
+ # Denotes a resource implementation which is missing significant
130
+ # functionality or is largely untested.
131
+ ALPHA = "This implementation is **ALPHA** quality. It is experimental, may be missing significant functionality, and has not been widely tested."
132
+
133
+ # Denotes a resource implementation which supports most or all key API
134
+ # functionality and has seen at least some non-trivial testing.
135
+ BETA = "This implementation is **BETA** quality. It is substantially complete, but may be missing some functionality or have some features which are untested."
136
+
137
+ # Denotes a resource implementation which supports all key API functionality
138
+ # and has been substantially tested on real-world applications.
139
+ RELEASE = "This implementation is considered **RELEASE** quality. It covers all major API features and has been tested with real-world applications."
140
+
129
141
  # The types of cloud resources we can create, as class objects. Include
130
142
  # methods a class implementing this resource type must support to be
131
143
  # considered valid.
132
144
  @@resource_types = {
145
+ :Folder => {
146
+ :has_multiples => false,
147
+ :can_live_in_vpc => false,
148
+ :cfg_name => "folder",
149
+ :cfg_plural => "folders",
150
+ :interface => self.const_get("Folder"),
151
+ :deps_wait_on_my_creation => true,
152
+ :waits_on_parent_completion => true,
153
+ :class => generic_class_methods,
154
+ :instance => generic_instance_methods
155
+ },
156
+ :Habitat => {
157
+ :has_multiples => false,
158
+ :can_live_in_vpc => false,
159
+ :cfg_name => "habitat",
160
+ :cfg_plural => "habitats",
161
+ :interface => self.const_get("Habitat"),
162
+ :deps_wait_on_my_creation => true,
163
+ :waits_on_parent_completion => true,
164
+ :class => generic_class_methods,
165
+ :instance => generic_instance_methods + [:groom]
166
+ },
133
167
  :Collection => {
134
168
  :has_multiples => false,
135
169
  :can_live_in_vpc => false,
@@ -328,28 +362,6 @@ module MU
328
362
  :class => generic_class_methods,
329
363
  :instance => generic_instance_methods + [:groom]
330
364
  },
331
- :Habitat => {
332
- :has_multiples => false,
333
- :can_live_in_vpc => false,
334
- :cfg_name => "habitat",
335
- :cfg_plural => "habitats",
336
- :interface => self.const_get("Habitat"),
337
- :deps_wait_on_my_creation => true,
338
- :waits_on_parent_completion => true,
339
- :class => generic_class_methods,
340
- :instance => generic_instance_methods
341
- },
342
- :Folder => {
343
- :has_multiples => false,
344
- :can_live_in_vpc => false,
345
- :cfg_name => "folder",
346
- :cfg_plural => "folders",
347
- :interface => self.const_get("Folder"),
348
- :deps_wait_on_my_creation => true,
349
- :waits_on_parent_completion => true,
350
- :class => generic_class_methods,
351
- :instance => generic_instance_methods
352
- },
353
365
  :User => {
354
366
  :has_multiples => false,
355
367
  :can_live_in_vpc => false,
@@ -1028,6 +1040,12 @@ module MU
1028
1040
  return [@dependencies, @vpc, @loadbalancers]
1029
1041
  end
1030
1042
 
1043
+ # Defaults any resources that don't declare their release-readiness to
1044
+ # ALPHA. That'll learn 'em.
1045
+ def self.quality
1046
+ MU::Cloud::ALPHA
1047
+ end
1048
+
1031
1049
  def self.find(*flags)
1032
1050
  allfound = {}
1033
1051
 
@@ -150,6 +150,12 @@ module MU
150
150
  end
151
151
  end
152
152
 
153
+ # Denote whether this resource implementation is experiment, ready for
154
+ # testing, or ready for production use.
155
+ def self.quality
156
+ MU::Cloud::RELEASE
157
+ end
158
+
153
159
  # Locate an existing alarm.
154
160
  # @param cloud_id [String]: The cloud provider's identifier for this resource.
155
161
  # @param region [String]: The cloud provider region.
@@ -39,6 +39,8 @@ module MU
39
39
  # Called automatically by {MU::Deploy#createResources}
40
40
  def create
41
41
  bucket_name = @deploy.getResourceName(@config["name"], max_length: 63).downcase
42
+
43
+ MU.log "Creating S3 bucket #{bucket_name}"
42
44
  MU::Cloud::AWS.s3(credentials: @config['credentials'], region: @config['region']).create_bucket(
43
45
  acl: @config['acl'],
44
46
  bucket: bucket_name
@@ -83,6 +85,7 @@ module MU
83
85
 
84
86
  # Called automatically by {MU::Deploy#createResources}
85
87
  def groom
88
+
86
89
  @@region_cache_semaphore.synchronize {
87
90
  @@region_cache[@cloud_id] ||= @config['region']
88
91
  }
@@ -90,6 +93,17 @@ module MU
90
93
 
91
94
  current = cloud_desc
92
95
 
96
+ if @config['policies']
97
+ policy_docs = MU::Cloud::AWS::Role.genPolicyDocument(@config['policies'], deploy_obj: @deploy)
98
+ policy_docs.each { |doc|
99
+ MU.log "Applying S3 bucket policy #{doc.keys.first} to bucket #{@cloud_id}", MU::NOTICE, details: doc.values.first
100
+ MU::Cloud::AWS.s3(credentials: @config['credentials'], region: @config['region']).put_bucket_policy(
101
+ bucket: @cloud_id,
102
+ policy: JSON.generate(doc.values.first)
103
+ )
104
+ }
105
+ end
106
+
93
107
  if @config['web'] and current["website"].nil?
94
108
  MU.log "Enabling web service on S3 bucket #{@cloud_id}", MU::NOTICE
95
109
  MU::Cloud::AWS.s3(credentials: @config['credentials'], region: @config['region']).put_bucket_website(
@@ -138,6 +152,12 @@ module MU
138
152
  false
139
153
  end
140
154
 
155
+ # Denote whether this resource implementation is experiment, ready for
156
+ # testing, or ready for production use.
157
+ def self.quality
158
+ MU::Cloud::BETA
159
+ end
160
+
141
161
  # Remove all buckets associated with the currently loaded deployment.
142
162
  # @param noop [Boolean]: If true, will only print what would be done
143
163
  # @param ignoremaster [Boolean]: If true, will remove resources not flagged as originating from this Mu server
@@ -217,6 +237,7 @@ module MU
217
237
  def self.schema(config)
218
238
  toplevel_required = []
219
239
  schema = {
240
+ "policies" => MU::Cloud::AWS::Role.condition_schema,
220
241
  "acl" => {
221
242
  "type" => "string",
222
243
  "enum" => ["private", "public-read", "public-read-write", "authenticated-read"],
@@ -239,6 +260,14 @@ module MU
239
260
  def self.validateConfig(bucket, configurator)
240
261
  ok = true
241
262
 
263
+ if bucket['policies']
264
+ bucket['policies'].each { |pol|
265
+ if !pol['permissions'] or pol['permissions'].empty?
266
+ pol['permissions'] = ["s3:GetObject"]
267
+ end
268
+ }
269
+ end
270
+
242
271
  ok
243
272
  end
244
273
 
@@ -579,6 +579,12 @@ module MU
579
579
  false
580
580
  end
581
581
 
582
+ # Denote whether this resource implementation is experiment, ready for
583
+ # testing, or ready for production use.
584
+ def self.quality
585
+ MU::Cloud::RELEASE
586
+ end
587
+
582
588
  # Called by {MU::Cleanup}. Locates resources that were created by the currently-loaded deployment and purges them.
583
589
  # @param noop [Boolean]: If true, will only print what would be done.
584
590
  # @param ignoremaster [Boolean]: If true, will remove resources not flagged as originating from this Mu server.
@@ -363,6 +363,12 @@ module MU
363
363
  false
364
364
  end
365
365
 
366
+ # Denote whether this resource implementation is experiment, ready for
367
+ # testing, or ready for production use.
368
+ def self.quality
369
+ MU::Cloud::RELEASE
370
+ end
371
+
366
372
  # Remove all container_clusters associated with the currently loaded deployment.
367
373
  # @param noop [Boolean]: If true, will only print what would be done
368
374
  # @param ignoremaster [Boolean]: If true, will remove resources not flagged as originating from this Mu server
@@ -1197,6 +1197,12 @@ module MU
1197
1197
  false
1198
1198
  end
1199
1199
 
1200
+ # Denote whether this resource implementation is experiment, ready for
1201
+ # testing, or ready for production use.
1202
+ def self.quality
1203
+ MU::Cloud::RELEASE
1204
+ end
1205
+
1200
1206
  # Called by {MU::Cleanup}. Locates resources that were created by the
1201
1207
  # currently-loaded deployment, and purges them.
1202
1208
  # @param noop [Boolean]: If true, will only print what would be done
@@ -664,6 +664,12 @@ module MU
664
664
  true
665
665
  end
666
666
 
667
+ # Denote whether this resource implementation is experiment, ready for
668
+ # testing, or ready for production use.
669
+ def self.quality
670
+ MU::Cloud::RELEASE
671
+ end
672
+
667
673
  # Called by {MU::Cleanup}. Locates resources that were created by the
668
674
  # currently-loaded deployment, and purges them.
669
675
  def self.cleanup(noop: false, ignoremaster: false, region: MU.curRegion, credentials: nil, flags: {})
@@ -448,6 +448,12 @@ MU::Cloud::AWS.apig(region: @config['region'], credentials: @config['credentials
448
448
  false
449
449
  end
450
450
 
451
+ # Denote whether this resource implementation is experiment, ready for
452
+ # testing, or ready for production use.
453
+ def self.quality
454
+ MU::Cloud::BETA
455
+ end
456
+
451
457
  # Canonical Amazon Resource Number for this resource
452
458
  # @return [String]
453
459
  def arn
@@ -235,6 +235,12 @@ module MU
235
235
  false
236
236
  end
237
237
 
238
+ # Denote whether this resource implementation is experiment, ready for
239
+ # testing, or ready for production use.
240
+ def self.quality
241
+ MU::Cloud::RELEASE
242
+ end
243
+
238
244
  # Remove all security groups (firewall rulesets) associated with the currently loaded deployment.
239
245
  # @param noop [Boolean]: If true, will only print what would be done
240
246
  # @param ignoremaster [Boolean]: If true, will remove resources not flagged as originating from this Mu server
@@ -55,6 +55,12 @@ module MU
55
55
  true
56
56
  end
57
57
 
58
+ # Denote whether this resource implementation is experiment, ready for
59
+ # testing, or ready for production use.
60
+ def self.quality
61
+ MU::Cloud::ALPHA
62
+ end
63
+
58
64
  # Remove all logs associated with the currently loaded deployment.
59
65
  # @param noop [Boolean]: If true, will only print what would be done
60
66
  # @param ignoremaster [Boolean]: If true, will remove resources not flagged as originating from this Mu server
@@ -267,6 +267,12 @@ module MU
267
267
  false
268
268
  end
269
269
 
270
+ # Denote whether this resource implementation is experiment, ready for
271
+ # testing, or ready for production use.
272
+ def self.quality
273
+ MU::Cloud::BETA
274
+ end
275
+
270
276
  # Remove all functions associated with the currently loaded deployment.
271
277
  # @param noop [Boolean]: If true, will only print what would be done
272
278
  # @param ignoremaster [Boolean]: If true, will remove resources not flagged as originating from this Mu server
@@ -130,6 +130,12 @@ module MU
130
130
  true
131
131
  end
132
132
 
133
+ # Denote whether this resource implementation is experiment, ready for
134
+ # testing, or ready for production use.
135
+ def self.quality
136
+ MU::Cloud::BETA
137
+ end
138
+
133
139
  # Remove all groups associated with the currently loaded deployment.
134
140
  # @param noop [Boolean]: If true, will only print what would be done
135
141
  # @param ignoremaster [Boolean]: If true, will remove resources not flagged as originating from this Mu server
@@ -632,6 +632,12 @@ module MU
632
632
  false
633
633
  end
634
634
 
635
+ # Denote whether this resource implementation is experiment, ready for
636
+ # testing, or ready for production use.
637
+ def self.quality
638
+ MU::Cloud::RELEASE
639
+ end
640
+
635
641
  # Remove all load balancers associated with the currently loaded deployment.
636
642
  # @param noop [Boolean]: If true, will only print what would be done
637
643
  # @param ignoremaster [Boolean]: If true, will remove resources not flagged as originating from this Mu server