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

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 (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