cloud-mu 3.1.6 → 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.
- checksums.yaml +4 -4
- data/bin/mu-adopt +4 -12
- data/bin/mu-azure-tests +57 -0
- data/bin/mu-cleanup +2 -4
- data/bin/mu-configure +37 -1
- data/bin/mu-deploy +3 -3
- data/bin/mu-findstray-tests +25 -0
- data/bin/mu-gen-docs +2 -4
- data/bin/mu-run-tests +23 -10
- data/cloud-mu.gemspec +2 -2
- data/cookbooks/mu-tools/libraries/helper.rb +1 -1
- data/cookbooks/mu-tools/recipes/apply_security.rb +14 -14
- data/cookbooks/mu-tools/recipes/aws_api.rb +9 -0
- data/extras/generate-stock-images +1 -0
- data/modules/mu.rb +82 -95
- data/modules/mu/adoption.rb +356 -56
- data/modules/mu/cleanup.rb +21 -20
- data/modules/mu/cloud.rb +79 -1753
- data/modules/mu/cloud/database.rb +49 -0
- data/modules/mu/cloud/dnszone.rb +46 -0
- data/modules/mu/cloud/machine_images.rb +212 -0
- data/modules/mu/cloud/providers.rb +81 -0
- data/modules/mu/cloud/resource_base.rb +920 -0
- data/modules/mu/cloud/server.rb +40 -0
- data/modules/mu/cloud/server_pool.rb +1 -0
- data/modules/mu/cloud/ssh_sessions.rb +228 -0
- data/modules/mu/cloud/winrm_sessions.rb +237 -0
- data/modules/mu/cloud/wrappers.rb +165 -0
- data/modules/mu/config.rb +122 -80
- data/modules/mu/config/alarm.rb +2 -6
- data/modules/mu/config/bucket.rb +1 -1
- data/modules/mu/config/cache_cluster.rb +1 -1
- data/modules/mu/config/collection.rb +1 -1
- data/modules/mu/config/container_cluster.rb +2 -2
- data/modules/mu/config/database.rb +83 -104
- data/modules/mu/config/database.yml +1 -2
- data/modules/mu/config/dnszone.rb +1 -1
- data/modules/mu/config/doc_helpers.rb +4 -5
- data/modules/mu/config/endpoint.rb +1 -1
- data/modules/mu/config/firewall_rule.rb +3 -19
- data/modules/mu/config/folder.rb +1 -1
- data/modules/mu/config/function.rb +1 -1
- data/modules/mu/config/group.rb +1 -1
- data/modules/mu/config/habitat.rb +1 -1
- data/modules/mu/config/loadbalancer.rb +57 -11
- data/modules/mu/config/log.rb +1 -1
- data/modules/mu/config/msg_queue.rb +1 -1
- data/modules/mu/config/nosqldb.rb +1 -1
- data/modules/mu/config/notifier.rb +1 -1
- data/modules/mu/config/ref.rb +30 -4
- data/modules/mu/config/role.rb +1 -1
- data/modules/mu/config/schema_helpers.rb +30 -34
- data/modules/mu/config/search_domain.rb +1 -1
- data/modules/mu/config/server.rb +4 -12
- data/modules/mu/config/server_pool.rb +3 -7
- data/modules/mu/config/storage_pool.rb +1 -1
- data/modules/mu/config/tail.rb +10 -0
- data/modules/mu/config/user.rb +1 -1
- data/modules/mu/config/vpc.rb +12 -17
- data/modules/mu/defaults/AWS.yaml +32 -32
- data/modules/mu/defaults/Azure.yaml +1 -0
- data/modules/mu/defaults/Google.yaml +1 -0
- data/modules/mu/deploy.rb +16 -15
- data/modules/mu/groomer.rb +15 -0
- data/modules/mu/groomers/chef.rb +3 -0
- data/modules/mu/logger.rb +120 -144
- data/modules/mu/master.rb +1 -1
- data/modules/mu/mommacat.rb +54 -25
- data/modules/mu/mommacat/daemon.rb +10 -7
- data/modules/mu/mommacat/naming.rb +82 -3
- data/modules/mu/mommacat/search.rb +47 -15
- data/modules/mu/mommacat/storage.rb +72 -41
- data/modules/mu/{clouds → providers}/README.md +1 -1
- data/modules/mu/{clouds → providers}/aws.rb +114 -47
- data/modules/mu/{clouds → providers}/aws/alarm.rb +1 -1
- data/modules/mu/{clouds → providers}/aws/bucket.rb +2 -2
- data/modules/mu/{clouds → providers}/aws/cache_cluster.rb +10 -46
- data/modules/mu/{clouds → providers}/aws/collection.rb +3 -3
- data/modules/mu/{clouds → providers}/aws/container_cluster.rb +15 -33
- data/modules/mu/providers/aws/database.rb +1744 -0
- data/modules/mu/{clouds → providers}/aws/dnszone.rb +2 -5
- data/modules/mu/{clouds → providers}/aws/endpoint.rb +2 -11
- data/modules/mu/{clouds → providers}/aws/firewall_rule.rb +33 -29
- data/modules/mu/{clouds → providers}/aws/folder.rb +0 -0
- data/modules/mu/{clouds → providers}/aws/function.rb +2 -10
- data/modules/mu/{clouds → providers}/aws/group.rb +9 -13
- data/modules/mu/{clouds → providers}/aws/habitat.rb +1 -1
- data/modules/mu/{clouds → providers}/aws/loadbalancer.rb +41 -33
- data/modules/mu/{clouds → providers}/aws/log.rb +2 -2
- data/modules/mu/{clouds → providers}/aws/msg_queue.rb +2 -8
- data/modules/mu/{clouds → providers}/aws/nosqldb.rb +0 -0
- data/modules/mu/{clouds → providers}/aws/notifier.rb +0 -0
- data/modules/mu/{clouds → providers}/aws/role.rb +7 -7
- data/modules/mu/{clouds → providers}/aws/search_domain.rb +8 -13
- data/modules/mu/{clouds → providers}/aws/server.rb +55 -90
- data/modules/mu/{clouds → providers}/aws/server_pool.rb +10 -33
- data/modules/mu/{clouds → providers}/aws/storage_pool.rb +19 -36
- data/modules/mu/{clouds → providers}/aws/user.rb +8 -12
- data/modules/mu/{clouds → providers}/aws/userdata/README.md +0 -0
- data/modules/mu/{clouds → providers}/aws/userdata/linux.erb +0 -0
- data/modules/mu/{clouds → providers}/aws/userdata/windows.erb +0 -0
- data/modules/mu/{clouds → providers}/aws/vpc.rb +135 -70
- data/modules/mu/{clouds → providers}/aws/vpc_subnet.rb +0 -0
- data/modules/mu/{clouds → providers}/azure.rb +4 -1
- data/modules/mu/{clouds → providers}/azure/container_cluster.rb +1 -5
- data/modules/mu/{clouds → providers}/azure/firewall_rule.rb +8 -1
- data/modules/mu/{clouds → providers}/azure/habitat.rb +0 -0
- data/modules/mu/{clouds → providers}/azure/loadbalancer.rb +0 -0
- data/modules/mu/{clouds → providers}/azure/role.rb +0 -0
- data/modules/mu/{clouds → providers}/azure/server.rb +30 -23
- data/modules/mu/{clouds → providers}/azure/user.rb +1 -1
- data/modules/mu/{clouds → providers}/azure/userdata/README.md +0 -0
- data/modules/mu/{clouds → providers}/azure/userdata/linux.erb +0 -0
- data/modules/mu/{clouds → providers}/azure/userdata/windows.erb +0 -0
- data/modules/mu/{clouds → providers}/azure/vpc.rb +4 -6
- data/modules/mu/{clouds → providers}/cloudformation.rb +1 -1
- data/modules/mu/{clouds → providers}/cloudformation/alarm.rb +3 -3
- data/modules/mu/{clouds → providers}/cloudformation/cache_cluster.rb +3 -3
- data/modules/mu/{clouds → providers}/cloudformation/collection.rb +3 -3
- data/modules/mu/{clouds → providers}/cloudformation/database.rb +6 -17
- data/modules/mu/{clouds → providers}/cloudformation/dnszone.rb +3 -3
- data/modules/mu/{clouds → providers}/cloudformation/firewall_rule.rb +3 -3
- data/modules/mu/{clouds → providers}/cloudformation/loadbalancer.rb +3 -3
- data/modules/mu/{clouds → providers}/cloudformation/log.rb +3 -3
- data/modules/mu/{clouds → providers}/cloudformation/server.rb +7 -7
- data/modules/mu/{clouds → providers}/cloudformation/server_pool.rb +5 -5
- data/modules/mu/{clouds → providers}/cloudformation/vpc.rb +3 -3
- data/modules/mu/{clouds → providers}/docker.rb +0 -0
- data/modules/mu/{clouds → providers}/google.rb +14 -6
- data/modules/mu/{clouds → providers}/google/bucket.rb +1 -1
- data/modules/mu/{clouds → providers}/google/container_cluster.rb +28 -13
- data/modules/mu/{clouds → providers}/google/database.rb +1 -8
- data/modules/mu/{clouds → providers}/google/firewall_rule.rb +2 -2
- data/modules/mu/{clouds → providers}/google/folder.rb +4 -8
- data/modules/mu/{clouds → providers}/google/function.rb +3 -3
- data/modules/mu/{clouds → providers}/google/group.rb +8 -16
- data/modules/mu/{clouds → providers}/google/habitat.rb +3 -7
- data/modules/mu/{clouds → providers}/google/loadbalancer.rb +1 -1
- data/modules/mu/{clouds → providers}/google/role.rb +42 -34
- data/modules/mu/{clouds → providers}/google/server.rb +25 -10
- data/modules/mu/{clouds → providers}/google/server_pool.rb +10 -10
- data/modules/mu/{clouds → providers}/google/user.rb +31 -21
- data/modules/mu/{clouds → providers}/google/userdata/README.md +0 -0
- data/modules/mu/{clouds → providers}/google/userdata/linux.erb +0 -0
- data/modules/mu/{clouds → providers}/google/userdata/windows.erb +0 -0
- data/modules/mu/{clouds → providers}/google/vpc.rb +37 -2
- data/modules/tests/centos6.yaml +11 -0
- data/modules/tests/centos7.yaml +11 -0
- data/modules/tests/centos8.yaml +12 -0
- data/modules/tests/rds.yaml +108 -0
- data/modules/tests/regrooms/rds.yaml +123 -0
- data/spec/mu/clouds/azure_spec.rb +2 -2
- metadata +108 -89
- data/modules/mu/clouds/aws/database.rb +0 -1974
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: fd9a15a0e94a578919c0cb22bf5c95ee86b5b4a03fcc0ea1c35da2c161e8cf31
|
|
4
|
+
data.tar.gz: 04cdc9d9a70de97fdaf12021166b707921ec981d7ab2dc92cd1ebce491a9e130
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: adfef4f231a946a3929b7f8026a9e338658dadfef3482942a46e8fdb9b10c4ca7d68aa457d135815a3878882d88a103ec1ebacea4bcb1ae4c45b070d85ceee06
|
|
7
|
+
data.tar.gz: 3a7b04d7d2486b05e8d413b78029b610bb7ba6bd8a33a1c24cf7b8bdf63dabaf9e0a1baab8408a66f995d05df719261248cbf27ee5b230a350109053ddb0420a
|
data/bin/mu-adopt
CHANGED
|
@@ -21,12 +21,6 @@ require 'bundler/setup'
|
|
|
21
21
|
require 'optimist'
|
|
22
22
|
require 'mu'
|
|
23
23
|
|
|
24
|
-
available_clouds = MU::Cloud.supportedClouds
|
|
25
|
-
available_clouds.reject! { |cloud|
|
|
26
|
-
cloudclass = Object.const_get("MU").const_get("Cloud").const_get(cloud)
|
|
27
|
-
cloudclass.listCredentials.nil? or cloudclass.listCredentials.size == 0
|
|
28
|
-
}
|
|
29
|
-
|
|
30
24
|
available_types = MU::Cloud.resource_types.keys.map { |t| t.to_s }
|
|
31
25
|
grouping_options = {
|
|
32
26
|
"logical" => "Group resources in logical layers (folders and habitats together, users/roles/groups together, network resources together, etc)",
|
|
@@ -39,15 +33,17 @@ $opt = Optimist::options do
|
|
|
39
33
|
EOS
|
|
40
34
|
opt :appname, "The overarching name of the application stack we will generate", :required => false, :default => "mu", :type => :string
|
|
41
35
|
opt :types, "The resource types to scan and import. Valid types: #{available_types.join(", ")}", :required => false, :type => :strings, :default => available_types
|
|
42
|
-
opt :clouds, "The cloud providers to scan and import.", :required => false, :type => :strings, :default =>
|
|
36
|
+
opt :clouds, "The cloud providers to scan and import.", :required => false, :type => :strings, :default => MU::Cloud.availableClouds
|
|
43
37
|
opt :parent, "Where applicable, resources which reside in the root folder or organization are configured with the specified parent in our target BoK", :required => false, :type => :string
|
|
44
38
|
opt :billing, "Force-set this billing entity on created resources, instead of copying from the live resources", :required => false, :type => :string
|
|
45
39
|
opt :sources, "One or more sets of credentials to use when importing resources. By default we will search and import from all sets of available credentials for each cloud provider specified with --clouds", :required => false, :type => :strings
|
|
46
40
|
opt :credentials, "Override the 'credentials' value in our generated Baskets of Kittens to target a single, specific account. Our default behavior is to set each resource to deploy into the account from which it was sourced.", :required => false, :type => :string
|
|
47
41
|
opt :savedeploys, "Generate actual deployment metadata in #{MU.dataDir}/deployments, as though the resources we found were created with mu-deploy. If we are generating more than one configuration, and a resource needs to reference another resource (e.g. to declare a VPC in which to reside), this will allow us to reference them as virtual resource, rather than by raw cloud identifier.", :required => false, :type => :boolean, :default => false
|
|
48
42
|
opt :diff, "List the differences between what we find and an existing, saved deploy from a previous run, if one exists.", :required => false, :type => :boolean
|
|
43
|
+
opt :merge_changes, "When using --diff, merge detected changes into the baseline deploy after reporting on them.", :required => false, :type => :boolean, :default => false
|
|
49
44
|
opt :grouping, "Methods for grouping found resources into separate Baskets.\n\n"+MU::Adoption::GROUPMODES.keys.map { |g| "* "+g.to_s+": "+MU::Adoption::GROUPMODES[g] }.join("\n")+"\n\n", :required => false, :type => :string, :default => "logical"
|
|
50
45
|
opt :habitats, "Limit scope of searches to the named accounts/projects/subscriptions, instead of search all habitats visible to our credentials.", :required => false, :type => :strings
|
|
46
|
+
opt :regions, "Restrict to operating on a subset of available regions, instead of all that we know about.", :require => false, :type => :strings
|
|
51
47
|
opt :scrub, "Whether to set scrub_mu_isms in the BoKs we generate", :default => $MU_CFG.has_key?('adopt_scrub_mu_isms') ? $MU_CFG['adopt_scrub_mu_isms'] : false
|
|
52
48
|
end
|
|
53
49
|
|
|
@@ -102,8 +98,7 @@ if !ok
|
|
|
102
98
|
exit 1
|
|
103
99
|
end
|
|
104
100
|
|
|
105
|
-
|
|
106
|
-
adoption = MU::Adoption.new(clouds: clouds, types: types, parent: $opt[:parent], billing: $opt[:billing], sources: $opt[:sources], credentials: $opt[:credentials], group_by: $opt[:grouping].to_sym, savedeploys: $opt[:savedeploys], diff: $opt[:diff], habitats: $opt[:habitats], scrub_mu_isms: $opt[:scrub])
|
|
101
|
+
adoption = MU::Adoption.new(clouds: clouds, types: types, parent: $opt[:parent], billing: $opt[:billing], sources: $opt[:sources], credentials: $opt[:credentials], group_by: $opt[:grouping].to_sym, savedeploys: $opt[:savedeploys], diff: $opt[:diff], habitats: $opt[:habitats], scrub_mu_isms: $opt[:scrub], regions: $opt[:regions], merge: $opt[:merge_changes])
|
|
107
102
|
found = adoption.scrapeClouds
|
|
108
103
|
if found.nil? or found.empty?
|
|
109
104
|
MU.log "No resources found to adopt", MU::WARN, details: {"clouds" => clouds, "types" => types }
|
|
@@ -117,10 +112,7 @@ boks.each_pair { |appname, bok|
|
|
|
117
112
|
File.open("#{appname}.yaml", "w") { |f|
|
|
118
113
|
f.write JSON.parse(JSON.generate(bok)).to_yaml
|
|
119
114
|
}
|
|
120
|
-
conf_engine = MU::Config.new("#{appname}.yaml")
|
|
121
|
-
stack_conf = conf_engine.config
|
|
122
115
|
# puts stack_conf.to_yaml
|
|
123
|
-
MU.log "#{appname}.yaml validated successfully", MU::NOTICE
|
|
124
116
|
MU::Cloud.resource_types.each_pair { |type, cfg|
|
|
125
117
|
if bok[cfg[:cfg_plural]]
|
|
126
118
|
MU.log "#{bok[cfg[:cfg_plural]].size.to_s} #{cfg[:cfg_plural]}", MU::NOTICE
|
data/bin/mu-azure-tests
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
#!/usr/local/ruby-current/bin/ruby
|
|
2
|
+
# Copyright:: Copyright (c) 2014 eGlobalTech, Inc., all rights reserved
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the BSD-3 license (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License in the root of the project or at
|
|
7
|
+
#
|
|
8
|
+
# http://egt-labs.com/mu/LICENSE.html
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
require 'rubygems'
|
|
17
|
+
require 'bundler/setup'
|
|
18
|
+
require 'json'
|
|
19
|
+
require 'erb'
|
|
20
|
+
require 'optimist'
|
|
21
|
+
require 'json-schema'
|
|
22
|
+
require File.realpath(File.expand_path(File.dirname(__FILE__)+"/mu-load-config.rb"))
|
|
23
|
+
require 'mu'
|
|
24
|
+
|
|
25
|
+
(0..100000).to_a.each { |n|
|
|
26
|
+
retries = 0
|
|
27
|
+
seed = nil
|
|
28
|
+
# begin
|
|
29
|
+
# raise MuError, "Failed to allocate an unused MU-ID after #{retries} tries!" if retries > 70
|
|
30
|
+
# seedsize = 1 + (retries/10).abs
|
|
31
|
+
# seed = (0...seedsize+1).map { ('a'..'z').to_a[rand(26)] }.join
|
|
32
|
+
# end while seed == "mu" or seed[0] == seed[1]
|
|
33
|
+
seed = "nn"
|
|
34
|
+
handle = MU::MommaCat.generateHandle(seed)
|
|
35
|
+
puts handle
|
|
36
|
+
}
|
|
37
|
+
exit
|
|
38
|
+
|
|
39
|
+
#pp MU::Cloud::Azure.listRegions
|
|
40
|
+
#pp MU::Cloud::Azure::Habitat.testcalls
|
|
41
|
+
#pp MU::Cloud::Azure::VPC.find(cloud_id: MU::Cloud::Azure::Id.new(resource_group: "mu", name: "mu-vnet"))
|
|
42
|
+
#pp MU::Cloud::Azure.authorization.role_assignments.list_for_resource_group("AKS-DEV-2019062015-KA-EASTUS")
|
|
43
|
+
#pp MU::Cloud::Azure::Role.find(role_name: "Azure Kubernetes Service Cluster Admin Role")
|
|
44
|
+
#puts MU::Cloud::Azure.default_subscription
|
|
45
|
+
#pp MU::Cloud::Azure.fetchPublicIP("MYVPC-DEV-2019061911-XI-EASTUS", "ip-addr-thingy")
|
|
46
|
+
#pp MU::Cloud::Azure.ensureProvider("egtazure", "Microsoft.ContainerService", force: true)
|
|
47
|
+
pp MU::Cloud::Azure::Server.find(cloud_id: "mu")
|
|
48
|
+
exit
|
|
49
|
+
pp MU::Cloud::Azure::Server.fetchImage("OpenLogic/CentOS/6")
|
|
50
|
+
pp MU::Cloud::Azure::Server.fetchImage("OpenLogic/CentOS/7")
|
|
51
|
+
pp MU::Cloud::Azure::Server.fetchImage("RedHat/RHEL/8")
|
|
52
|
+
pp MU::Cloud::Azure::Server.fetchImage("RedHat/RHEL/7")
|
|
53
|
+
pp MU::Cloud::Azure::Server.fetchImage("RedHat/RHEL/6")
|
|
54
|
+
pp MU::Cloud::Azure::Server.fetchImage("Debian/debian-10/10")
|
|
55
|
+
pp MU::Cloud::Azure::Server.fetchImage("MicrosoftWindowsServer/WindowsServer/2012-R2-Datacenter")
|
|
56
|
+
pp MU::Cloud::Azure::Server.fetchImage("MicrosoftWindowsServer/WindowsServer/2016-Datacenter")
|
|
57
|
+
pp MU::Cloud::Azure::Server.fetchImage("MicrosoftWindowsServer/WindowsServer/2019-Datacenter")
|
data/bin/mu-cleanup
CHANGED
|
@@ -24,10 +24,8 @@ require 'mu'
|
|
|
24
24
|
Dir.chdir(MU.installDir)
|
|
25
25
|
|
|
26
26
|
credentials = []
|
|
27
|
-
MU::Cloud.
|
|
28
|
-
|
|
29
|
-
next if cloudclass.listCredentials.nil? or cloudclass.listCredentials.size == 0
|
|
30
|
-
credentials.concat(cloudclass.listCredentials)
|
|
27
|
+
MU::Cloud.availableClouds.each { |cloud|
|
|
28
|
+
credentials.concat(MU::Cloud.cloudClass(cloud).listCredentials)
|
|
31
29
|
}
|
|
32
30
|
credentials.uniq!
|
|
33
31
|
|
data/bin/mu-configure
CHANGED
|
@@ -113,12 +113,44 @@ $CONFIGURABLES = {
|
|
|
113
113
|
"desc" => "Disable the Momma Cat grooming daemon. Nodes which require asynchronous Ansible/Chef bootstraps will not function. This option is only honored in gem-based installations.",
|
|
114
114
|
"boolean" => true
|
|
115
115
|
},
|
|
116
|
+
"adopt_change_notify" => {
|
|
117
|
+
"title" => "Adoption Change Notifications",
|
|
118
|
+
"subtree" => {
|
|
119
|
+
"slack" => {
|
|
120
|
+
"title" => "Send to Slack",
|
|
121
|
+
"desc" => "Report modifications to adopted resources, detected by mu-adopt --diff, to the Slack webhook and channel configured under Slack Configuration.",
|
|
122
|
+
"boolean" => true
|
|
123
|
+
},
|
|
124
|
+
"slack_snippet_threshold" => {
|
|
125
|
+
"title" => "Attachment Threshold",
|
|
126
|
+
"desc" => "If a list of details about a modified resources is longer than this number of lines (in JSON), it will be sent as an \"attachment,\" which in Slack means a blockquote that displays a few lines with a \"Show more\" button. The internal default is 5 lines."
|
|
127
|
+
},
|
|
128
|
+
# "email" => {
|
|
129
|
+
# "title" => "Send Email",
|
|
130
|
+
# "desc" => "",
|
|
131
|
+
# "boolean" => true
|
|
132
|
+
# }
|
|
133
|
+
}
|
|
134
|
+
},
|
|
116
135
|
"adopt_scrub_mu_isms" => {
|
|
117
|
-
"title" => "
|
|
136
|
+
"title" => "Scrub Mu-isms from Baskets of Kittens",
|
|
118
137
|
"default" => false,
|
|
119
138
|
"desc" => "Ordinarily, Mu will automatically name, tag and generate auxiliary resources in a standard Mu-ish fashion that allows for deployment of multiple clones of a given stack. Toggling this flag will change the default behavior of mu-adopt, when it creates stack descriptors from found resources, to enable or disable this behavior (see also mu-adopt's --scrub option).",
|
|
120
139
|
"boolean" => true
|
|
121
140
|
},
|
|
141
|
+
"slack" => {
|
|
142
|
+
"title" => "Slack Configuration",
|
|
143
|
+
"subtree" => {
|
|
144
|
+
"webhook" => {
|
|
145
|
+
"title" => "Webhook",
|
|
146
|
+
"desc" => "The hooks.slack.com URL for the webook to which we'll send deploy notifications"
|
|
147
|
+
},
|
|
148
|
+
"channel" => {
|
|
149
|
+
"title" => "Channel",
|
|
150
|
+
"desc" => "The channel name (without leading #) to which alerts should be sent."
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
},
|
|
122
154
|
"mommacat_port" => {
|
|
123
155
|
"title" => "Momma Cat Listen Port",
|
|
124
156
|
"pattern" => /^[0-9]+$/i,
|
|
@@ -247,6 +279,10 @@ $CONFIGURABLES = {
|
|
|
247
279
|
"required" => false,
|
|
248
280
|
"desc" => "For Google Cloud projects which are attached to a GSuite domain. GCP service accounts cannot view or manage GSuite resources (groups, users, etc) directly, but must instead masquerade as a GSuite user which has delegated authority to the service account. See also: https://developers.google.com/identity/protocols/OAuth2ServiceAccount#delegatingauthority"
|
|
249
281
|
},
|
|
282
|
+
"org" => {
|
|
283
|
+
"title" => "Default Org/Domain",
|
|
284
|
+
"desc" => "For credential sets which have access to multiple GSuite or Cloud Identity orgs, you must specify a default organization (e.g. my.domain.com)."
|
|
285
|
+
},
|
|
250
286
|
"customer_id" => {
|
|
251
287
|
"title" => "GSuite Customer ID",
|
|
252
288
|
"required" => false,
|
data/bin/mu-deploy
CHANGED
|
@@ -105,7 +105,7 @@ if $opts[:dryrun]
|
|
|
105
105
|
Thread.handle_interrupt(MU::Cloud::MuCloudResourceNotImplemented => :never) {
|
|
106
106
|
begin
|
|
107
107
|
Thread.handle_interrupt(MU::Cloud::MuCloudResourceNotImplemented => :immediate) {
|
|
108
|
-
MU.log "Cost calculator not available for this stack, as it uses a resource not implemented in Mu's CloudFormation layer.", MU::
|
|
108
|
+
MU.log "Cost calculator not available for this stack, as it uses a resource not implemented in Mu's CloudFormation layer.", MU::NOTICE, verbosity: MU::Logger::NORMAL
|
|
109
109
|
Thread.current.exit
|
|
110
110
|
}
|
|
111
111
|
ensure
|
|
@@ -124,7 +124,7 @@ if $opts[:dryrun]
|
|
|
124
124
|
)
|
|
125
125
|
cost_dummy_deploy.run
|
|
126
126
|
rescue MU::Cloud::MuCloudResourceNotImplemented, MU::Cloud::MuCloudFlagNotImplemented
|
|
127
|
-
MU.log "Cost calculator not available for this stack, as it uses a resource not implemented in Mu's CloudFormation layer.", MU::
|
|
127
|
+
MU.log "Cost calculator not available for this stack, as it uses a resource not implemented in Mu's CloudFormation layer.", MU::NOTICE, verbosity: MU::Logger::NORMAL
|
|
128
128
|
end
|
|
129
129
|
end
|
|
130
130
|
exit
|
|
@@ -135,7 +135,7 @@ if $opts[:update]
|
|
|
135
135
|
# TODO consider whether this is useful/valid
|
|
136
136
|
# old_conf = JSON.parse(File.read(deploy.deploy_dir+"/basket_of_kittens.json"))
|
|
137
137
|
# stack_conf = old_conf.merge(stack_conf)
|
|
138
|
-
deploy.updateBasketofKittens(stack_conf)
|
|
138
|
+
deploy.updateBasketofKittens(stack_conf, skip_validation: true)
|
|
139
139
|
deployer = MU::Deploy.new(
|
|
140
140
|
deploy.environment,
|
|
141
141
|
verbosity: verbosity,
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/usr/local/ruby-current/bin/ruby
|
|
2
|
+
# Copyright:: Copyright (c) 2014 eGlobalTech, Inc., all rights reserved
|
|
3
|
+
#
|
|
4
|
+
# Licensed under the BSD-3 license (the "License");
|
|
5
|
+
# you may not use this file except in compliance with the License.
|
|
6
|
+
# You may obtain a copy of the License in the root of the project or at
|
|
7
|
+
#
|
|
8
|
+
# http://egt-labs.com/mu/LICENSE.html
|
|
9
|
+
#
|
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
# See the License for the specific language governing permissions and
|
|
14
|
+
# limitations under the License.
|
|
15
|
+
|
|
16
|
+
require 'rubygems'
|
|
17
|
+
require 'bundler/setup'
|
|
18
|
+
require 'json'
|
|
19
|
+
require 'erb'
|
|
20
|
+
require 'optimist'
|
|
21
|
+
require 'json-schema'
|
|
22
|
+
require File.realpath(File.expand_path(File.dirname(__FILE__)+"/mu-load-config.rb"))
|
|
23
|
+
require 'mu'
|
|
24
|
+
|
|
25
|
+
MU::MommaCat.findStray("AWS", "firewall_rule", region: MU.myRegion, dummy_ok: true, debug: true)
|
data/bin/mu-gen-docs
CHANGED
|
@@ -79,8 +79,7 @@ EOF
|
|
|
79
79
|
impl_counts[type] ||= 0
|
|
80
80
|
[a, b].each { |cloud|
|
|
81
81
|
begin
|
|
82
|
-
|
|
83
|
-
case myclass.quality
|
|
82
|
+
case MU::Cloud.resourceClass(cloud, type).quality
|
|
84
83
|
when MU::Cloud::RELEASE
|
|
85
84
|
cloud_is_useful[cloud] = true
|
|
86
85
|
counts[cloud] += 4
|
|
@@ -114,8 +113,7 @@ EOF
|
|
|
114
113
|
cloudlist.each { |cloud|
|
|
115
114
|
readme += "<td><center>"
|
|
116
115
|
begin
|
|
117
|
-
|
|
118
|
-
case myclass.quality
|
|
116
|
+
case MU::Cloud.resourceClass(cloud, type).quality
|
|
119
117
|
when MU::Cloud::RELEASE
|
|
120
118
|
readme += "<img src='release.png' style='#{icon_style}' title='Release Quality' alt='[Release Quality]'>"
|
|
121
119
|
when MU::Cloud::BETA
|
data/bin/mu-run-tests
CHANGED
|
@@ -42,7 +42,7 @@ only = ARGV
|
|
|
42
42
|
|
|
43
43
|
files = Dir.glob("*.yaml", base: dir)
|
|
44
44
|
files.concat(Dir.glob("*.yml", base: dir))
|
|
45
|
-
baseclouds = MU::Cloud.
|
|
45
|
+
baseclouds = MU::Cloud.availableClouds.reject { |c| c == "CloudFormation" }
|
|
46
46
|
|
|
47
47
|
commands = {}
|
|
48
48
|
failures = []
|
|
@@ -56,20 +56,33 @@ end
|
|
|
56
56
|
|
|
57
57
|
files.each { |f|
|
|
58
58
|
clouds = baseclouds.dup
|
|
59
|
+
groomer_match = true
|
|
59
60
|
File.open(dir+"/"+f).readlines.each { |l|
|
|
60
61
|
l.chomp!
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
62
|
+
if l.match(/^\s*#\s*clouds: (.*)/)
|
|
63
|
+
clouds = []
|
|
64
|
+
cloudstr = Regexp.last_match[1]
|
|
65
|
+
cloudstr.split(/\s*,\s*/).each { |c|
|
|
66
|
+
baseclouds.each { |cloud|
|
|
67
|
+
if cloud.match(/^#{Regexp.quote(c)}$/i)
|
|
68
|
+
clouds << cloud
|
|
69
|
+
end
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
elsif l.match(/^\s*#\s*groomers: (.*)/)
|
|
73
|
+
groomerstr = Regexp.last_match[1]
|
|
74
|
+
groomerstr.split(/\s*,\s*/).each { |g|
|
|
75
|
+
if !MU::Groomer.availableGroomers.include?(g)
|
|
76
|
+
MU.log "#{f} requires groomer #{g}, which is not available. This test will be skipped.", MU::NOTICE
|
|
77
|
+
groomer_match = false
|
|
68
78
|
end
|
|
69
79
|
}
|
|
70
|
-
|
|
71
|
-
break
|
|
80
|
+
end
|
|
72
81
|
}
|
|
82
|
+
if !groomer_match
|
|
83
|
+
next
|
|
84
|
+
end
|
|
85
|
+
|
|
73
86
|
clouds.each { |cloud|
|
|
74
87
|
cmd = "mu-deploy #{f} --cloud #{cloud} #{$opts[:full] ? "" : "--dryrun"}"
|
|
75
88
|
commands[cmd] = {
|
data/cloud-mu.gemspec
CHANGED
|
@@ -17,8 +17,8 @@ end
|
|
|
17
17
|
|
|
18
18
|
Gem::Specification.new do |s|
|
|
19
19
|
s.name = 'cloud-mu'
|
|
20
|
-
s.version = '3.
|
|
21
|
-
s.date = '2020-
|
|
20
|
+
s.version = '3.2.0'
|
|
21
|
+
s.date = '2020-06-16'
|
|
22
22
|
s.require_paths = ['modules']
|
|
23
23
|
s.required_ruby_version = '>= 2.4'
|
|
24
24
|
s.summary = "The eGTLabs Mu toolkit for unified cloud deployments"
|
|
@@ -252,21 +252,21 @@ if !node['application_attributes']['skip_recipes'].include?('apply_security')
|
|
|
252
252
|
# end
|
|
253
253
|
# 6.3 Configure PAM
|
|
254
254
|
# 6.3.2 Set Password Creation Requirement Parameters Using pam_cracklib
|
|
255
|
-
template "/etc/pam.d/password-auth-local" do
|
|
256
|
-
source "etc_pamd_password-auth.erb"
|
|
257
|
-
mode 0644
|
|
258
|
-
end
|
|
259
|
-
link "/etc/pam.d/password-auth" do
|
|
260
|
-
to "/etc/pam.d/password-auth-local"
|
|
261
|
-
end
|
|
255
|
+
# template "/etc/pam.d/password-auth-local" do
|
|
256
|
+
# source "etc_pamd_password-auth.erb"
|
|
257
|
+
# mode 0644
|
|
258
|
+
# end
|
|
259
|
+
# link "/etc/pam.d/password-auth" do
|
|
260
|
+
# to "/etc/pam.d/password-auth-local"
|
|
261
|
+
# end
|
|
262
262
|
#6.3.3 Set Lockout for Failed Password Attempts
|
|
263
|
-
template "/etc/pam.d/system-auth-local" do
|
|
264
|
-
source "etc_pamd_system-auth.erb"
|
|
265
|
-
mode 0644
|
|
266
|
-
end
|
|
267
|
-
link "/etc/pam.d/system-auth" do
|
|
268
|
-
to "/etc/pam.d/system-auth-local"
|
|
269
|
-
end
|
|
263
|
+
# template "/etc/pam.d/system-auth-local" do
|
|
264
|
+
# source "etc_pamd_system-auth.erb"
|
|
265
|
+
# mode 0644
|
|
266
|
+
# end
|
|
267
|
+
# link "/etc/pam.d/system-auth" do
|
|
268
|
+
# to "/etc/pam.d/system-auth-local"
|
|
269
|
+
# end
|
|
270
270
|
|
|
271
271
|
#SV-50303r1_rule/SV-50304r1_rule
|
|
272
272
|
execute "chown root:root /etc/shadow"
|
|
@@ -21,3 +21,12 @@ chef_gem "aws-sdk-core" do
|
|
|
21
21
|
version "2.11.24"
|
|
22
22
|
action :install
|
|
23
23
|
end
|
|
24
|
+
|
|
25
|
+
if platform_family?("rhel") or platform_family?("amazon")
|
|
26
|
+
if node['platform_version'].to_i == 6
|
|
27
|
+
package "python34-pip"
|
|
28
|
+
execute "/usr/bin/pip3 install awscli" do
|
|
29
|
+
not_if "test -x /usr/bin/aws"
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -91,6 +91,7 @@ $opts[:clouds].each { |cloud|
|
|
|
91
91
|
end
|
|
92
92
|
next if !needed
|
|
93
93
|
end
|
|
94
|
+
MU.log "Loading "+bok_dir+"/"+cloud+"/"+platform+".yaml"
|
|
94
95
|
conf_engine = MU::Config.new(
|
|
95
96
|
bok_dir+"/"+cloud+"/"+platform+".yaml",
|
|
96
97
|
default_credentials: $opts[(cloud.downcase+"_creds").to_sym]
|
data/modules/mu.rb
CHANGED
|
@@ -79,38 +79,40 @@ class Hash
|
|
|
79
79
|
}
|
|
80
80
|
return 0 if self == other # that was easy!
|
|
81
81
|
# compare elements and decide who's "bigger" based on their totals?
|
|
82
|
-
|
|
82
|
+
|
|
83
|
+
# fine, try some brute force and just hope everything implements to_s
|
|
84
|
+
self.flatten.map { |e| e.to_s }.join() <=> other.flatten.map { |e| e.to_s }.join()
|
|
83
85
|
end
|
|
84
86
|
|
|
85
|
-
# Recursively compare two hashes
|
|
86
|
-
def diff(with, on = self, level: 0, parents: [])
|
|
87
|
+
# Recursively compare two Mu Basket of Kittens hashes and report the differences
|
|
88
|
+
def diff(with, on = self, level: 0, parents: [], report: {}, habitat: nil)
|
|
87
89
|
return if with.nil? and on.nil?
|
|
88
90
|
if with.nil? or on.nil? or with.class != on.class
|
|
89
91
|
return # XXX ...however we're flagging differences
|
|
90
92
|
end
|
|
91
93
|
return if on == with
|
|
92
94
|
|
|
93
|
-
tree = ""
|
|
94
|
-
indentsize = 0
|
|
95
|
-
parents.each { |p|
|
|
96
|
-
tree += (" " * indentsize) + p + " => \n"
|
|
97
|
-
indentsize += 2
|
|
98
|
-
}
|
|
99
|
-
indent = (" " * indentsize)
|
|
100
|
-
|
|
101
95
|
changes = []
|
|
96
|
+
report ||= {}
|
|
102
97
|
if on.is_a?(Hash)
|
|
103
98
|
on_unique = (on.keys - with.keys)
|
|
104
99
|
with_unique = (with.keys - on.keys)
|
|
105
100
|
shared = (with.keys & on.keys)
|
|
106
101
|
shared.each { |k|
|
|
107
|
-
|
|
102
|
+
|
|
103
|
+
report_data = diff(with[k], on[k], level: level+1, parents: parents + [k], report: report[k], habitat: habitat)
|
|
104
|
+
if report_data and !report_data.empty?
|
|
105
|
+
report ||= {}
|
|
106
|
+
report[k] = report_data
|
|
107
|
+
end
|
|
108
108
|
}
|
|
109
109
|
on_unique.each { |k|
|
|
110
|
-
|
|
110
|
+
report[k] = { :action => :removed, :parents => parents, :value => on[k].clone }
|
|
111
|
+
report[k][:habitat] = habitat if habitat
|
|
111
112
|
}
|
|
112
113
|
with_unique.each { |k|
|
|
113
|
-
|
|
114
|
+
report[k] = { :action => :added, :parents => parents, :value => with[k].clone }
|
|
115
|
+
report[k][:habitat] = habitat if habitat
|
|
114
116
|
}
|
|
115
117
|
elsif on.is_a?(Array)
|
|
116
118
|
return if with == on
|
|
@@ -122,29 +124,27 @@ class Hash
|
|
|
122
124
|
# sorting arrays full of weird, non-primitive types.
|
|
123
125
|
done = []
|
|
124
126
|
on.sort.each { |elt|
|
|
125
|
-
if elt.is_a?(Hash) and elt
|
|
126
|
-
|
|
127
|
-
# Figure out what convention this thing is using for resource identification
|
|
128
|
-
compare_a, compare_b = if elt['name'].nil? and elt["id"].nil? and !elt["entity"].nil? and !other_elt["entity"].nil?
|
|
129
|
-
[elt["entity"], other_elt["entity"]]
|
|
130
|
-
else
|
|
131
|
-
[elt, other_elt]
|
|
132
|
-
end
|
|
127
|
+
if elt.is_a?(Hash) and !MU::MommaCat.getChunkName(elt).first.nil?
|
|
128
|
+
elt_namestr, elt_location, elt_location_list = MU::MommaCat.getChunkName(elt)
|
|
133
129
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
130
|
+
with.sort.each { |other_elt|
|
|
131
|
+
other_elt_namestr, other_elt_location, other_elt_location_list = MU::MommaCat.getChunkName(other_elt)
|
|
132
|
+
|
|
133
|
+
# Case 1: The array element exists in both version of this array
|
|
134
|
+
if elt_namestr and other_elt_namestr and
|
|
135
|
+
elt_namestr == other_elt_namestr and
|
|
136
|
+
(elt_location.nil? or other_elt_location.nil? or
|
|
137
|
+
elt_location == other_elt_location or
|
|
138
|
+
!(elt_location_list & other_elt_location_list).empty?
|
|
139
|
+
)
|
|
137
140
|
done << elt
|
|
138
141
|
done << other_elt
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
elt['entity']['id']
|
|
142
|
+
break if elt == other_elt # if they're identical, we're done
|
|
143
|
+
report_data = diff(other_elt, elt, level: level+1, parents: parents + [elt_namestr], habitat: (elt_location || habitat))
|
|
144
|
+
if report_data and !report_data.empty?
|
|
145
|
+
report ||= {}
|
|
146
|
+
report[elt_namestr] = report_data
|
|
145
147
|
end
|
|
146
|
-
|
|
147
|
-
diff(other_elt, elt, level: level+1, parents: parents + [namestr])
|
|
148
148
|
break
|
|
149
149
|
end
|
|
150
150
|
}
|
|
@@ -152,43 +152,34 @@ class Hash
|
|
|
152
152
|
}
|
|
153
153
|
on_unique = (on - with) - done
|
|
154
154
|
with_unique = (with - on) - done
|
|
155
|
-
|
|
156
|
-
#
|
|
157
|
-
# MU.log "A BEFORE", MU::NOTICE, details: before_a
|
|
158
|
-
# MU.log "A AFTER", MU::NOTICE, details: after_a
|
|
159
|
-
# end
|
|
160
|
-
# if before_b != after_b
|
|
161
|
-
# MU.log "B BEFORE", MU::NOTICE, details: before_b
|
|
162
|
-
# MU.log "B AFTER", MU::NOTICE, details: after_b
|
|
163
|
-
# end
|
|
164
|
-
# end
|
|
155
|
+
|
|
156
|
+
# Case 2: This array entry exists in the old version, but not the new one
|
|
165
157
|
on_unique.each { |e|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
158
|
+
namestr, loc = MU::MommaCat.getChunkName(e)
|
|
159
|
+
|
|
160
|
+
report ||= {}
|
|
161
|
+
report[namestr] = { :action => :removed, :parents => parents, :value => e.clone }
|
|
162
|
+
report[namestr][:habitat] = loc if loc
|
|
171
163
|
}
|
|
164
|
+
|
|
165
|
+
# Case 3: This array entry exists in the new version, but not the old one
|
|
172
166
|
with_unique.each { |e|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
167
|
+
namestr, loc = MU::MommaCat.getChunkName(e)
|
|
168
|
+
|
|
169
|
+
report ||= {}
|
|
170
|
+
report[namestr] = { :action => :added, :parents => parents, :value => e.clone }
|
|
171
|
+
report[namestr][:habitat] = loc if loc
|
|
178
172
|
}
|
|
173
|
+
|
|
174
|
+
# A plain old leaf node of data
|
|
179
175
|
else
|
|
180
176
|
if on != with
|
|
181
|
-
|
|
182
|
-
|
|
177
|
+
report = { :action => :changed, :parents => parents, :oldvalue => on, :value => with.clone }
|
|
178
|
+
report[:habitat] = habitat if habitat
|
|
183
179
|
end
|
|
184
180
|
end
|
|
185
181
|
|
|
186
|
-
|
|
187
|
-
puts tree
|
|
188
|
-
changes.each { |c|
|
|
189
|
-
puts indent+c
|
|
190
|
-
}
|
|
191
|
-
end
|
|
182
|
+
report.freeze
|
|
192
183
|
end
|
|
193
184
|
|
|
194
185
|
# Implement a merge! that just updates each hash leaf as needed, not
|
|
@@ -212,8 +203,29 @@ class Hash
|
|
|
212
203
|
end
|
|
213
204
|
|
|
214
205
|
ENV['HOME'] = Etc.getpwuid(Process.uid).dir
|
|
206
|
+
module MU
|
|
207
|
+
|
|
208
|
+
# For log entries that should only be logged when we're in verbose mode
|
|
209
|
+
DEBUG = 0.freeze
|
|
210
|
+
# For ordinary log entries
|
|
211
|
+
INFO = 1.freeze
|
|
212
|
+
# For more interesting log entries which are not errors
|
|
213
|
+
NOTICE = 2.freeze
|
|
214
|
+
# Log entries for non-fatal errors
|
|
215
|
+
WARN = 3.freeze
|
|
216
|
+
# Log entries for non-fatal errors
|
|
217
|
+
WARNING = 3.freeze
|
|
218
|
+
# Log entries for fatal errors
|
|
219
|
+
ERR = 4.freeze
|
|
220
|
+
# Log entries for fatal errors
|
|
221
|
+
ERROR = 4.freeze
|
|
222
|
+
# Log entries that will be held and displayed/emailed at the end of deploy,
|
|
223
|
+
# cleanup, etc.
|
|
224
|
+
SUMMARY = 5.freeze
|
|
225
|
+
end
|
|
215
226
|
|
|
216
227
|
require 'mu/logger'
|
|
228
|
+
|
|
217
229
|
module MU
|
|
218
230
|
|
|
219
231
|
# Subclass core thread so we can gracefully handle it when we hit system
|
|
@@ -273,8 +285,9 @@ module MU
|
|
|
273
285
|
# Wrapper class for fatal Exceptions. Gives our internals something to
|
|
274
286
|
# inherit that will log an error message appropriately before bubbling up.
|
|
275
287
|
class MuError < StandardError
|
|
276
|
-
def initialize(message = nil, silent: false)
|
|
277
|
-
|
|
288
|
+
def initialize(message = nil, silent: false, details: nil)
|
|
289
|
+
details ||= caller[2]
|
|
290
|
+
MU.log message, MU::ERR, details: details if !message.nil? and !silent
|
|
278
291
|
if MU.verbosity == MU::Logger::SILENT
|
|
279
292
|
super ""
|
|
280
293
|
else
|
|
@@ -620,25 +633,6 @@ module MU
|
|
|
620
633
|
@@logger.log(msg, level, details: details, html: html, verbosity: verbosity, color: color)
|
|
621
634
|
end
|
|
622
635
|
|
|
623
|
-
# For log entries that should only be logged when we're in verbose mode
|
|
624
|
-
DEBUG = 0.freeze
|
|
625
|
-
# For ordinary log entries
|
|
626
|
-
INFO = 1.freeze
|
|
627
|
-
# For more interesting log entries which are not errors
|
|
628
|
-
NOTICE = 2.freeze
|
|
629
|
-
# Log entries for non-fatal errors
|
|
630
|
-
WARN = 3.freeze
|
|
631
|
-
# Log entries for non-fatal errors
|
|
632
|
-
WARNING = 3.freeze
|
|
633
|
-
# Log entries for fatal errors
|
|
634
|
-
ERR = 4.freeze
|
|
635
|
-
# Log entries for fatal errors
|
|
636
|
-
ERROR = 4.freeze
|
|
637
|
-
# Log entries that will be held and displayed/emailed at the end of deploy,
|
|
638
|
-
# cleanup, etc.
|
|
639
|
-
SUMMARY = 5.freeze
|
|
640
|
-
|
|
641
|
-
|
|
642
636
|
autoload :Cleanup, 'mu/cleanup'
|
|
643
637
|
autoload :Deploy, 'mu/deploy'
|
|
644
638
|
autoload :MommaCat, 'mu/mommacat'
|
|
@@ -652,7 +646,7 @@ module MU
|
|
|
652
646
|
new_cfg = $MU_CFG.dup
|
|
653
647
|
examples = {}
|
|
654
648
|
MU::Cloud.supportedClouds.each { |cloud|
|
|
655
|
-
cloudclass =
|
|
649
|
+
cloudclass = MU::Cloud.cloudClass(cloud)
|
|
656
650
|
begin
|
|
657
651
|
if cloudclass.hosted? and !$MU_CFG[cloud.downcase]
|
|
658
652
|
cfg_blob = cloudclass.hosted_config
|
|
@@ -808,11 +802,7 @@ module MU
|
|
|
808
802
|
# @param groomer [String]: The grooming agent to load.
|
|
809
803
|
# @return [Class]: The class object implementing this groomer agent
|
|
810
804
|
def self.loadGroomer(groomer)
|
|
811
|
-
|
|
812
|
-
raise MuError, "Requested to use unsupported grooming agent #{groomer}"
|
|
813
|
-
end
|
|
814
|
-
require "mu/groomers/#{groomer.downcase}"
|
|
815
|
-
return Object.const_get("MU").const_get("Groomer").const_get(groomer)
|
|
805
|
+
MU::Groomer.loadGroomer(groomer)
|
|
816
806
|
end
|
|
817
807
|
|
|
818
808
|
@@myRegion_var = nil
|
|
@@ -966,8 +956,7 @@ module MU
|
|
|
966
956
|
|
|
967
957
|
@@myCloudDescriptor = nil
|
|
968
958
|
if MU.myCloud
|
|
969
|
-
|
|
970
|
-
found = svrclass.find(cloud_id: @@myInstanceId, region: MU.myRegion) # XXX need habitat arg for google et al
|
|
959
|
+
found = MU::Cloud.resourceClass(MU.myCloud, "Server").find(cloud_id: @@myInstanceId, region: MU.myRegion) # XXX need habitat arg for google et al
|
|
971
960
|
# found = MU::MommaCat.findStray(MU.myCloud, "server", cloud_id: @@myInstanceId, dummy_ok: true, region: MU.myRegion)
|
|
972
961
|
if !found.nil? and found.size == 1
|
|
973
962
|
@@myCloudDescriptor = found.values.first
|
|
@@ -980,8 +969,7 @@ module MU
|
|
|
980
969
|
def self.myVPCObj
|
|
981
970
|
return nil if MU.myCloud.nil?
|
|
982
971
|
return @@myVPCObj_var if @@myVPCObj_var
|
|
983
|
-
|
|
984
|
-
@@myVPCObj_var ||= cloudclass.myVPCObj
|
|
972
|
+
@@myVPCObj_var ||= MU::Cloud.cloudClass(MU.myCloud).myVPCObj
|
|
985
973
|
@@myVPCObj_var
|
|
986
974
|
end
|
|
987
975
|
|
|
@@ -1106,10 +1094,9 @@ module MU
|
|
|
1106
1094
|
|
|
1107
1095
|
clouds = platform.nil? ? MU::Cloud.supportedClouds : [platform]
|
|
1108
1096
|
clouds.each { |cloud|
|
|
1109
|
-
|
|
1110
|
-
bucketname = cloudclass.adminBucketName(credentials)
|
|
1097
|
+
bucketname = MU::Cloud.cloudClass(cloud).adminBucketName(credentials)
|
|
1111
1098
|
begin
|
|
1112
|
-
if platform or (
|
|
1099
|
+
if platform or (MU::Cloud.cloudClass(cloud).hosted? and platform.nil?) or cloud == MU::Config.defaultCloud
|
|
1113
1100
|
return bucketname
|
|
1114
1101
|
end
|
|
1115
1102
|
end
|