cloud-mu 3.2.0 → 3.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Dockerfile +1 -1
- data/ansible/roles/mu-nat/tasks/main.yml +3 -0
- data/bin/mu-adopt +12 -1
- data/bin/mu-aws-setup +41 -7
- data/bin/mu-azure-setup +34 -0
- data/bin/mu-configure +214 -119
- data/bin/mu-gcp-setup +37 -2
- data/bin/mu-load-config.rb +2 -1
- data/bin/mu-node-manage +3 -0
- data/bin/mu-refresh-ssl +67 -0
- data/bin/mu-run-tests +28 -6
- data/bin/mu-self-update +30 -10
- data/bin/mu-upload-chef-artifacts +30 -26
- data/cloud-mu.gemspec +10 -8
- data/cookbooks/mu-master/attributes/default.rb +5 -1
- data/cookbooks/mu-master/metadata.rb +2 -2
- data/cookbooks/mu-master/recipes/default.rb +81 -26
- data/cookbooks/mu-master/recipes/init.rb +197 -62
- data/cookbooks/mu-master/recipes/update_nagios_only.rb +1 -1
- data/cookbooks/mu-master/recipes/vault.rb +78 -77
- data/cookbooks/mu-master/templates/default/mods/rewrite.conf.erb +1 -0
- data/cookbooks/mu-master/templates/default/nagios.conf.erb +103 -0
- data/cookbooks/mu-master/templates/default/web_app.conf.erb +14 -30
- data/cookbooks/mu-tools/attributes/default.rb +12 -0
- data/cookbooks/mu-tools/files/centos-6/CentOS-Base.repo +47 -0
- data/cookbooks/mu-tools/libraries/helper.rb +98 -4
- data/cookbooks/mu-tools/libraries/monkey.rb +1 -1
- data/cookbooks/mu-tools/recipes/apply_security.rb +31 -9
- data/cookbooks/mu-tools/recipes/aws_api.rb +8 -2
- data/cookbooks/mu-tools/recipes/base_repositories.rb +1 -1
- data/cookbooks/mu-tools/recipes/gcloud.rb +2 -9
- data/cookbooks/mu-tools/recipes/google_api.rb +7 -0
- data/cookbooks/mu-tools/recipes/rsyslog.rb +8 -1
- data/cookbooks/mu-tools/resources/disk.rb +113 -42
- data/cookbooks/mu-tools/resources/mommacat_request.rb +1 -2
- data/cookbooks/mu-tools/templates/centos-8/sshd_config.erb +215 -0
- data/extras/Gemfile.lock.bootstrap +394 -0
- data/extras/bucketstubs/error.html +0 -0
- data/extras/bucketstubs/index.html +0 -0
- data/extras/clean-stock-amis +11 -3
- data/extras/generate-stock-images +6 -3
- data/extras/git_rpm/build.sh +20 -0
- data/extras/git_rpm/mugit.spec +53 -0
- data/extras/image-generators/AWS/centos7.yaml +19 -16
- data/extras/image-generators/AWS/{rhel7.yaml → rhel71.yaml} +0 -0
- data/extras/image-generators/AWS/{win2k12.yaml → win2k12r2.yaml} +0 -0
- data/extras/image-generators/VMWare/centos8.yaml +15 -0
- data/extras/openssl_rpm/build.sh +19 -0
- data/extras/openssl_rpm/mussl.spec +46 -0
- data/extras/python_rpm/muthon.spec +14 -4
- data/extras/ruby_rpm/muby.spec +9 -5
- data/extras/sqlite_rpm/build.sh +19 -0
- data/extras/sqlite_rpm/muqlite.spec +47 -0
- data/install/installer +7 -5
- data/modules/mommacat.ru +2 -2
- data/modules/mu.rb +14 -7
- data/modules/mu/adoption.rb +5 -5
- data/modules/mu/cleanup.rb +47 -25
- data/modules/mu/cloud.rb +29 -1
- data/modules/mu/cloud/dnszone.rb +0 -2
- data/modules/mu/cloud/machine_images.rb +1 -1
- data/modules/mu/cloud/providers.rb +6 -1
- data/modules/mu/cloud/resource_base.rb +16 -7
- data/modules/mu/cloud/ssh_sessions.rb +5 -1
- data/modules/mu/cloud/wrappers.rb +20 -7
- data/modules/mu/config.rb +28 -12
- data/modules/mu/config/bucket.rb +31 -2
- data/modules/mu/config/cache_cluster.rb +1 -1
- data/modules/mu/config/cdn.rb +100 -0
- data/modules/mu/config/container_cluster.rb +1 -1
- data/modules/mu/config/database.rb +3 -3
- data/modules/mu/config/dnszone.rb +4 -3
- data/modules/mu/config/endpoint.rb +1 -0
- data/modules/mu/config/firewall_rule.rb +1 -1
- data/modules/mu/config/function.rb +16 -7
- data/modules/mu/config/job.rb +89 -0
- data/modules/mu/config/notifier.rb +7 -18
- data/modules/mu/config/ref.rb +55 -9
- data/modules/mu/config/schema_helpers.rb +12 -3
- data/modules/mu/config/server.rb +11 -5
- data/modules/mu/config/server_pool.rb +2 -2
- data/modules/mu/config/vpc.rb +11 -10
- data/modules/mu/defaults/AWS.yaml +106 -106
- data/modules/mu/deploy.rb +40 -14
- data/modules/mu/groomers/chef.rb +2 -2
- data/modules/mu/master.rb +70 -3
- data/modules/mu/mommacat.rb +28 -9
- data/modules/mu/mommacat/daemon.rb +13 -7
- data/modules/mu/mommacat/naming.rb +2 -2
- data/modules/mu/mommacat/search.rb +16 -5
- data/modules/mu/mommacat/storage.rb +67 -32
- data/modules/mu/providers/aws.rb +298 -85
- data/modules/mu/providers/aws/alarm.rb +5 -5
- data/modules/mu/providers/aws/bucket.rb +284 -50
- data/modules/mu/providers/aws/cache_cluster.rb +26 -26
- data/modules/mu/providers/aws/cdn.rb +782 -0
- data/modules/mu/providers/aws/collection.rb +16 -16
- data/modules/mu/providers/aws/container_cluster.rb +84 -64
- data/modules/mu/providers/aws/database.rb +59 -55
- data/modules/mu/providers/aws/dnszone.rb +29 -12
- data/modules/mu/providers/aws/endpoint.rb +535 -50
- data/modules/mu/providers/aws/firewall_rule.rb +32 -26
- data/modules/mu/providers/aws/folder.rb +1 -1
- data/modules/mu/providers/aws/function.rb +300 -134
- data/modules/mu/providers/aws/group.rb +16 -14
- data/modules/mu/providers/aws/habitat.rb +4 -4
- data/modules/mu/providers/aws/job.rb +469 -0
- data/modules/mu/providers/aws/loadbalancer.rb +67 -45
- data/modules/mu/providers/aws/log.rb +17 -17
- data/modules/mu/providers/aws/msg_queue.rb +22 -13
- data/modules/mu/providers/aws/nosqldb.rb +99 -8
- data/modules/mu/providers/aws/notifier.rb +137 -65
- data/modules/mu/providers/aws/role.rb +119 -83
- data/modules/mu/providers/aws/search_domain.rb +166 -30
- data/modules/mu/providers/aws/server.rb +209 -118
- data/modules/mu/providers/aws/server_pool.rb +95 -130
- data/modules/mu/providers/aws/storage_pool.rb +19 -11
- data/modules/mu/providers/aws/user.rb +5 -5
- data/modules/mu/providers/aws/userdata/linux.erb +5 -4
- data/modules/mu/providers/aws/vpc.rb +109 -54
- data/modules/mu/providers/aws/vpc_subnet.rb +43 -39
- data/modules/mu/providers/azure.rb +78 -12
- data/modules/mu/providers/azure/server.rb +20 -4
- data/modules/mu/providers/cloudformation/server.rb +1 -1
- data/modules/mu/providers/google.rb +21 -5
- data/modules/mu/providers/google/bucket.rb +1 -1
- data/modules/mu/providers/google/container_cluster.rb +1 -1
- data/modules/mu/providers/google/database.rb +1 -1
- data/modules/mu/providers/google/firewall_rule.rb +1 -1
- data/modules/mu/providers/google/folder.rb +7 -3
- data/modules/mu/providers/google/function.rb +66 -31
- data/modules/mu/providers/google/group.rb +1 -1
- data/modules/mu/providers/google/habitat.rb +1 -1
- data/modules/mu/providers/google/loadbalancer.rb +1 -1
- data/modules/mu/providers/google/role.rb +6 -3
- data/modules/mu/providers/google/server.rb +1 -1
- data/modules/mu/providers/google/server_pool.rb +1 -1
- data/modules/mu/providers/google/user.rb +1 -1
- data/modules/mu/providers/google/vpc.rb +28 -3
- data/modules/tests/aws-jobs-functions.yaml +46 -0
- data/modules/tests/aws-servers-with-handrolled-iam.yaml +37 -0
- data/modules/tests/centos6.yaml +4 -0
- data/modules/tests/centos7.yaml +4 -0
- data/modules/tests/ecs.yaml +2 -2
- data/modules/tests/eks.yaml +1 -1
- data/modules/tests/functions/node-function/lambda_function.js +10 -0
- data/modules/tests/functions/python-function/lambda_function.py +12 -0
- data/modules/tests/k8s.yaml +1 -1
- data/modules/tests/microservice_app.yaml +288 -0
- data/modules/tests/rds.yaml +5 -5
- data/modules/tests/regrooms/rds.yaml +5 -5
- data/modules/tests/server-with-scrub-muisms.yaml +1 -1
- data/modules/tests/super_complex_bok.yml +2 -2
- data/modules/tests/super_simple_bok.yml +2 -2
- metadata +42 -17
data/modules/mu/adoption.rb
CHANGED
@@ -30,8 +30,7 @@ module MU
|
|
30
30
|
:omnibus => "Jam everything into one monolothic configuration"
|
31
31
|
}
|
32
32
|
|
33
|
-
|
34
|
-
def initialize(clouds: MU::Cloud.supportedClouds, types: MU::Cloud.resource_types.keys, parent: nil, billing: nil, sources: nil, credentials: nil, group_by: :logical, savedeploys: false, diff: false, habitats: [], scrub_mu_isms: false, regions: [], merge: false)
|
33
|
+
def initialize(clouds: MU::Cloud.supportedClouds, types: MU::Cloud.resource_types.keys, parent: nil, billing: nil, sources: nil, credentials: nil, group_by: :logical, savedeploys: false, diff: false, habitats: [], scrub_mu_isms: false, regions: [], merge: false, pattern: nil)
|
35
34
|
@scraped = {}
|
36
35
|
@clouds = clouds
|
37
36
|
@types = types
|
@@ -49,6 +48,7 @@ module MU
|
|
49
48
|
@habitats ||= []
|
50
49
|
@scrub_mu_isms = scrub_mu_isms
|
51
50
|
@merge = merge
|
51
|
+
@pattern = pattern
|
52
52
|
end
|
53
53
|
|
54
54
|
# Walk cloud providers with available credentials to discover resources
|
@@ -127,6 +127,7 @@ module MU
|
|
127
127
|
if obj.habitat and !cloudclass.listHabitats(credset).include?(obj.habitat)
|
128
128
|
next
|
129
129
|
end
|
130
|
+
|
130
131
|
# XXX apply any filters (e.g. MU-ID tags)
|
131
132
|
if obj.cloud_id.nil?
|
132
133
|
MU.log "This damn thing gave me no cloud id, what do I even do with that", MU::ERR, details: obj
|
@@ -292,7 +293,7 @@ module MU
|
|
292
293
|
start = Time.now
|
293
294
|
|
294
295
|
kitten_cfg = obj.toKitten(rootparent: @default_parent, billing: @billing, habitats: @habitats, types: @types)
|
295
|
-
if kitten_cfg
|
296
|
+
if kitten_cfg and (!@pattern or @pattern.match(kitten_cfg['name']))
|
296
297
|
print "."
|
297
298
|
kitten_cfg.delete("credentials") if @target_creds
|
298
299
|
class_semaphore.synchronize {
|
@@ -791,8 +792,7 @@ module MU
|
|
791
792
|
elsif hashcfg["id"] and !hashcfg["name"]
|
792
793
|
hashcfg.delete("deploy_id")
|
793
794
|
else
|
794
|
-
|
795
|
-
raise Incomplete, "Failed to resolve reference on behalf of #{parent}"
|
795
|
+
raise Incomplete.new "Failed to resolve reference on behalf of #{parent}", details: hashcfg
|
796
796
|
end
|
797
797
|
hashcfg.delete("deploy_id") if hashcfg['deploy_id'] == deploy.deploy_id
|
798
798
|
|
data/modules/mu/cleanup.rb
CHANGED
@@ -32,7 +32,7 @@ module MU
|
|
32
32
|
|
33
33
|
# Resource types, in the order in which we generally have to clean them up
|
34
34
|
# to disentangle them from one another.
|
35
|
-
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"]
|
35
|
+
TYPES_IN_ORDER = ["Collection", "CDN", "Endpoint", "Function", "ServerPool", "ContainerCluster", "SearchDomain", "Server", "MsgQueue", "Database", "CacheCluster", "StoragePool", "LoadBalancer", "NoSQLDB", "FirewallRule", "Alarm", "Notifier", "Log", "Job", "VPC", "Role", "Group", "User", "Bucket", "DNSZone", "Collection"]
|
36
36
|
|
37
37
|
# Purge all resources associated with a deployment.
|
38
38
|
# @param deploy_id [String]: The identifier of the deployment to remove (typically seen in the MU-ID tag on a resource).
|
@@ -52,6 +52,7 @@ module MU
|
|
52
52
|
@onlycloud = onlycloud
|
53
53
|
@skipcloud = skipcloud
|
54
54
|
@ignoremaster = ignoremaster
|
55
|
+
@deploy_id = deploy_id
|
55
56
|
|
56
57
|
if @skipcloud and @onlycloud # you actually mean noop
|
57
58
|
@onlycloud = @skipcloud = false
|
@@ -217,51 +218,69 @@ module MU
|
|
217
218
|
cloudclass = MU::Cloud.cloudClass(cloud)
|
218
219
|
habitatclass = MU::Cloud.resourceClass(cloud, "Habitat")
|
219
220
|
|
220
|
-
|
221
|
-
|
222
|
-
projects = habitats
|
223
|
-
else
|
221
|
+
if !habitats
|
222
|
+
habitats = []
|
224
223
|
if $MU_CFG and $MU_CFG[cloud.downcase] and
|
225
224
|
$MU_CFG[cloud.downcase][credset] and
|
226
225
|
$MU_CFG[cloud.downcase][credset]["project"]
|
227
226
|
# XXX GCP credential schema needs an array for projects
|
228
|
-
|
227
|
+
habitats << $MU_CFG[cloud.downcase][credset]["project"]
|
229
228
|
end
|
230
229
|
begin
|
231
|
-
|
230
|
+
habitats.concat(cloudclass.listHabitats(credset, use_cache: false))
|
232
231
|
rescue NoMethodError
|
233
232
|
end
|
234
233
|
end
|
235
234
|
|
236
|
-
if
|
237
|
-
|
235
|
+
if habitats == []
|
236
|
+
habitats << "" # dummy
|
238
237
|
MU.log "Checking for #{cloud}/#{credset} resources from #{MU.deploy_id} in #{region}", MU::NOTICE
|
239
238
|
end
|
240
|
-
|
239
|
+
habitats.uniq!
|
241
240
|
|
242
241
|
# We do these in an order that unrolls dependent resources
|
243
242
|
# sensibly, and we hit :Collection twice because AWS
|
244
243
|
# CloudFormation sometimes fails internally.
|
245
|
-
|
246
|
-
|
247
|
-
if habitats and !habitats.empty? and
|
248
|
-
next if !habitats.include?(
|
244
|
+
habitat_threads = []
|
245
|
+
habitats.each { |habitat|
|
246
|
+
if habitats and !habitats.empty? and habitat != ""
|
247
|
+
next if !habitats.include?(habitat)
|
249
248
|
end
|
250
|
-
if @habitatsused and !@habitatsused.empty? and
|
251
|
-
next if !@habitatsused.include?(
|
249
|
+
if @habitatsused and !@habitatsused.empty? and habitat != ""
|
250
|
+
next if !@habitatsused.include?(habitat)
|
252
251
|
end
|
253
|
-
next if !habitatclass.isLive?(
|
252
|
+
next if !habitatclass.isLive?(habitat, credset)
|
254
253
|
|
255
|
-
|
254
|
+
habitat_threads << Thread.new {
|
255
|
+
Thread.current.thread_variable_set("name", "#{cloud}/#{credset}/#{habitat}/#{region}")
|
256
256
|
Thread.abort_on_exception = false
|
257
|
-
if !cleanHabitat(cloud, credset, region,
|
257
|
+
if !cleanHabitat(cloud, credset, region, habitat, global_vs_region_semaphore, global_done)
|
258
258
|
had_failures = true
|
259
259
|
end
|
260
260
|
} # TYPES_IN_ORDER.each { |t|
|
261
|
-
} #
|
262
|
-
|
263
|
-
|
264
|
-
|
261
|
+
} # habitats.each { |habitat|
|
262
|
+
|
263
|
+
last_checkin = Time.now
|
264
|
+
begin
|
265
|
+
deletia = []
|
266
|
+
habitat_threads.each { |t|
|
267
|
+
if !t.status
|
268
|
+
t.join
|
269
|
+
deletia << t
|
270
|
+
end
|
271
|
+
}
|
272
|
+
deletia.each { |t|
|
273
|
+
habitat_threads.delete(t)
|
274
|
+
}
|
275
|
+
if (Time.now - last_checkin) > 120
|
276
|
+
list = habitat_threads.map { |t|
|
277
|
+
t.thread_variable_get("name") + (t.thread_variable_get("type") ? "/"+t.thread_variable_get("type") : "")
|
278
|
+
}
|
279
|
+
MU.log "Waiting on #{habitat_threads.size.to_s} habitat#{habitat_threads.size > 1 ? "s" : ""} in region #{region}", MU::NOTICE, details: list
|
280
|
+
last_checkin = Time.now
|
281
|
+
end
|
282
|
+
sleep 10 if !habitat_threads.empty?
|
283
|
+
end while !habitat_threads.empty?
|
265
284
|
|
266
285
|
had_failures
|
267
286
|
end
|
@@ -311,7 +330,8 @@ module MU
|
|
311
330
|
next
|
312
331
|
end
|
313
332
|
}
|
314
|
-
|
333
|
+
|
334
|
+
had_failures
|
315
335
|
end
|
316
336
|
private_class_method :cleanHabitat
|
317
337
|
|
@@ -322,6 +342,7 @@ module MU
|
|
322
342
|
# @param flags [Hash]:
|
323
343
|
# @param region [String]:
|
324
344
|
def self.call_cleanup(type, credset, provider, flags, region)
|
345
|
+
Thread.current.thread_variable_set("type", type)
|
325
346
|
if @mommacat.nil? or @mommacat.numKittens(types: [type]) > 0
|
326
347
|
if @mommacat
|
327
348
|
|
@@ -344,7 +365,8 @@ module MU
|
|
344
365
|
region: region,
|
345
366
|
cloud: provider,
|
346
367
|
flags: flags,
|
347
|
-
credentials: credset
|
368
|
+
credentials: credset,
|
369
|
+
deploy_id: @deploy_id
|
348
370
|
)
|
349
371
|
else
|
350
372
|
true
|
data/modules/mu/cloud.rb
CHANGED
@@ -148,6 +148,12 @@ module MU
|
|
148
148
|
# Stub base class; real implementations generated at runtime
|
149
149
|
class NoSQLDB;
|
150
150
|
end
|
151
|
+
# Stub base class; real implementations generated at runtime
|
152
|
+
class Job;
|
153
|
+
end
|
154
|
+
# Stub base class; real implementations generated at runtime
|
155
|
+
class CDN;
|
156
|
+
end
|
151
157
|
|
152
158
|
# Denotes a resource implementation which is missing significant
|
153
159
|
# functionality or is largely untested.
|
@@ -436,7 +442,29 @@ module MU
|
|
436
442
|
:cfg_plural => "nosqldbs",
|
437
443
|
:interface => self.const_get("NoSQLDB"),
|
438
444
|
:deps_wait_on_my_creation => true,
|
439
|
-
:waits_on_parent_completion =>
|
445
|
+
:waits_on_parent_completion => false,
|
446
|
+
:class => @@generic_class_methods,
|
447
|
+
:instance => @@generic_instance_methods + [:groom]
|
448
|
+
},
|
449
|
+
:Job => {
|
450
|
+
:has_multiples => false,
|
451
|
+
:can_live_in_vpc => false,
|
452
|
+
:cfg_name => "job",
|
453
|
+
:cfg_plural => "jobs",
|
454
|
+
:interface => self.const_get("Job"),
|
455
|
+
:deps_wait_on_my_creation => true,
|
456
|
+
:waits_on_parent_completion => false,
|
457
|
+
:class => @@generic_class_methods,
|
458
|
+
:instance => @@generic_instance_methods + [:groom]
|
459
|
+
},
|
460
|
+
:CDN => {
|
461
|
+
:has_multiples => false,
|
462
|
+
:can_live_in_vpc => false,
|
463
|
+
:cfg_name => "cdn",
|
464
|
+
:cfg_plural => "cdns",
|
465
|
+
:interface => self.const_get("CDN"),
|
466
|
+
:deps_wait_on_my_creation => true,
|
467
|
+
:waits_on_parent_completion => false,
|
440
468
|
:class => @@generic_class_methods,
|
441
469
|
:instance => @@generic_instance_methods + [:groom]
|
442
470
|
}
|
data/modules/mu/cloud/dnszone.rb
CHANGED
@@ -29,8 +29,6 @@ module MU
|
|
29
29
|
|
30
30
|
# Wrapper for {MU::Cloud::AWS::DNSZone.manageRecord}. Spawns threads to create all
|
31
31
|
# requested records in background and returns immediately.
|
32
|
-
# @param cfg [Array]: An array of parsed {MU::Config::BasketofKittens::dnszones::records} objects.
|
33
|
-
# @param target [String]: Optional target for the records to be created. Overrides targets embedded in cfg records.
|
34
32
|
def self.createRecordsFromConfig(*flags)
|
35
33
|
cloudclass = MU::Cloud.resourceClass(MU::Config.defaultCloud, "DNSZone")
|
36
34
|
if !flags.nil? and flags.size == 1
|
@@ -64,7 +64,12 @@ module MU
|
|
64
64
|
# code for each of its supported resource type classes.
|
65
65
|
failed = []
|
66
66
|
MU::Cloud.supportedClouds.each { |cloud|
|
67
|
-
|
67
|
+
begin
|
68
|
+
require "mu/providers/#{cloud.downcase}"
|
69
|
+
rescue LoadError, Gem::MissingSpecError => e
|
70
|
+
MU.log "Error loading #{cloud} library, calls into this provider will fail", MU::ERR, details: e.message
|
71
|
+
next
|
72
|
+
end
|
68
73
|
cloudclass = Object.const_get("MU").const_get("Cloud").const_get(cloud)
|
69
74
|
@@generic_class_methods_toplevel.each { |method|
|
70
75
|
if !cloudclass.respond_to?(method)
|
@@ -227,6 +227,10 @@ module MU
|
|
227
227
|
}
|
228
228
|
end
|
229
229
|
|
230
|
+
MU::MommaCat.listOptionalTags.each_pair { |k, v|
|
231
|
+
@tags[k] ||= v if v
|
232
|
+
}
|
233
|
+
|
230
234
|
if @cloudparentclass.respond_to?(:resourceInitHook)
|
231
235
|
@cloudparentclass.resourceInitHook(self, @deploy)
|
232
236
|
end
|
@@ -265,6 +269,7 @@ module MU
|
|
265
269
|
attr_accessor :mu_windows_name # XXX might be ok as reader now
|
266
270
|
end
|
267
271
|
end
|
272
|
+
@tags["Name"] ||= @mu_name if @mu_name
|
268
273
|
end
|
269
274
|
|
270
275
|
end
|
@@ -733,7 +738,7 @@ module MU
|
|
733
738
|
MU.log "Couldn't find existing resource #{ext_deploy["cloud_id"]}, #{ext_deploy["cloud_type"]}", MU::ERR if found.nil?
|
734
739
|
@deploy.notify(ext_deploy["cloud_type"], found.config["name"], found.deploydata, mu_name: found.mu_name, triggering_node: @mu_name)
|
735
740
|
elsif ext_deploy["mu_name"] && ext_deploy["deploy_id"]
|
736
|
-
MU.log "#{ext_deploy["mu_name"]}
|
741
|
+
MU.log "#{self}: Importing metadata for #{ext_deploy["cloud_type"]} #{ext_deploy["mu_name"]} from #{ext_deploy["deploy_id"]}"
|
737
742
|
found = MU::MommaCat.findStray(
|
738
743
|
@config['cloud'],
|
739
744
|
ext_deploy["cloud_type"],
|
@@ -743,8 +748,11 @@ module MU
|
|
743
748
|
dummy_ok: false
|
744
749
|
).first
|
745
750
|
|
746
|
-
|
747
|
-
|
751
|
+
if found.nil?
|
752
|
+
MU.log "Couldn't find existing resource #{ext_deploy["mu_name"]}/#{ext_deploy["deploy_id"]}, #{ext_deploy["cloud_type"]}", MU::ERR
|
753
|
+
else
|
754
|
+
@deploy.notify(ext_deploy["cloud_type"], found.config["name"], found.deploydata, mu_name: ext_deploy["mu_name"], triggering_node: @mu_name)
|
755
|
+
end
|
748
756
|
else
|
749
757
|
MU.log "Trying to find existing deploy, but either the cloud_id is not valid or no mu_name and deploy_id where provided", MU::ERR
|
750
758
|
end
|
@@ -893,17 +901,18 @@ module MU
|
|
893
901
|
elsif method == :notify
|
894
902
|
if retval.nil?
|
895
903
|
MU.log self.to_s+" didn't return any metadata from notify", MU::WARN, details: @cloudobj.cloud_desc
|
904
|
+
else
|
905
|
+
retval['cloud_id'] = @cloudobj.cloud_id.to_s if !@cloudobj.cloud_id.nil?
|
906
|
+
retval['mu_name'] = @cloudobj.mu_name if !@cloudobj.mu_name.nil?
|
907
|
+
@deploy.notify(self.class.cfg_plural, @config['name'], retval, triggering_node: @cloudobj, delayed_save: @delayed_save) if !@deploy.nil?
|
896
908
|
end
|
897
|
-
retval['cloud_id'] = @cloudobj.cloud_id.to_s if !@cloudobj.cloud_id.nil?
|
898
|
-
retval['mu_name'] = @cloudobj.mu_name if !@cloudobj.mu_name.nil?
|
899
|
-
@deploy.notify(self.class.cfg_plural, @config['name'], retval, triggering_node: @cloudobj, delayed_save: @delayed_save) if !@deploy.nil?
|
900
909
|
end
|
901
910
|
@method_semaphore.synchronize {
|
902
911
|
@method_locks.delete(method)
|
903
912
|
}
|
904
913
|
|
905
914
|
@deploydata = @cloudobj.deploydata
|
906
|
-
@config = @cloudobj.config
|
915
|
+
@config = MU::Config.manxify(@cloudobj.config)
|
907
916
|
retval
|
908
917
|
end
|
909
918
|
} # end instance method list
|
@@ -125,7 +125,7 @@ module MU
|
|
125
125
|
end
|
126
126
|
end
|
127
127
|
end
|
128
|
-
rescue RuntimeError => e
|
128
|
+
rescue RuntimeError, IOError => e
|
129
129
|
raise MU::Cloud::BootstrapTempFail, "Got #{e.inspect} performing initial SSH connect tasks, will try again"
|
130
130
|
end
|
131
131
|
|
@@ -187,6 +187,10 @@ module MU
|
|
187
187
|
retry
|
188
188
|
# rescue SystemCallError, Timeout::Error, Errno::ECONNRESET, Errno::EHOSTUNREACH, Net::SSH::Proxy::ConnectError, SocketError, Net::SSH::Disconnect, Net::SSH::AuthenticationFailed, IOError, Net::SSH::ConnectionTimeout, Net::SSH::Proxy::ConnectError, MU::Cloud::NetSSHFail => e
|
189
189
|
rescue SystemExit, Timeout::Error, Net::SSH::AuthenticationFailed, Net::SSH::Disconnect, Net::SSH::ConnectionTimeout, Net::SSH::Proxy::ConnectError, Net::SSH::Exception, Errno::ECONNRESET, Errno::EHOSTUNREACH, Errno::ECONNREFUSED, Errno::EPIPE, SocketError, IOError => e
|
190
|
+
if !active?
|
191
|
+
raise MuError, "Server #{@mu_name} disappeared while I was attempting to log into it"
|
192
|
+
end
|
193
|
+
|
190
194
|
begin
|
191
195
|
session.close if !session.nil?
|
192
196
|
rescue Net::SSH::Disconnect, IOError => e
|
@@ -103,14 +103,23 @@ module MU
|
|
103
103
|
next
|
104
104
|
end
|
105
105
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
else
|
111
|
-
raise MuError, "#{cloudclass}.find returned a non-Hash result"
|
112
|
-
end
|
106
|
+
credsets = if args[:credentials]
|
107
|
+
[args[:credentials]]
|
108
|
+
else
|
109
|
+
cloudbase.listCredentials
|
113
110
|
end
|
111
|
+
|
112
|
+
credsets.each { |creds|
|
113
|
+
args[:credentials] = creds
|
114
|
+
found = cloudclass.find(args)
|
115
|
+
if !found.nil?
|
116
|
+
if found.is_a?(Hash)
|
117
|
+
allfound.merge!(found)
|
118
|
+
else
|
119
|
+
raise MuError, "#{cloudclass}.find returned a non-Hash result"
|
120
|
+
end
|
121
|
+
end
|
122
|
+
}
|
114
123
|
rescue MuCloudResourceNotImplemented
|
115
124
|
end
|
116
125
|
}
|
@@ -126,6 +135,10 @@ module MU
|
|
126
135
|
clouds = [params[:cloud]]
|
127
136
|
params.delete(:cloud)
|
128
137
|
end
|
138
|
+
params[:deploy_id] ||= MU.deploy_id
|
139
|
+
if !params[:deploy_id] or params[:deploy_id].empty?
|
140
|
+
raise MuError, "Can't call cleanup methods without a deploy id"
|
141
|
+
end
|
129
142
|
|
130
143
|
clouds.each { |cloud|
|
131
144
|
begin
|
data/modules/mu/config.rb
CHANGED
@@ -437,27 +437,27 @@ module MU
|
|
437
437
|
# @param type [String]
|
438
438
|
# @param phase [String]
|
439
439
|
# @param no_create_wait [Boolean]
|
440
|
-
def self.addDependency(resource, name, type,
|
441
|
-
if ![nil, "create", "groom"].include?(
|
442
|
-
raise MuError, "Invalid
|
440
|
+
def self.addDependency(resource, name, type, their_phase: "create", my_phase: nil)
|
441
|
+
if ![nil, "create", "groom"].include?(their_phase)
|
442
|
+
raise MuError, "Invalid their_phase '#{their_phase}' while adding dependency #{type} #{name} to #{resource['name']}"
|
443
443
|
end
|
444
444
|
resource['dependencies'] ||= []
|
445
445
|
_shortclass, cfg_name, _cfg_plural, _classname = MU::Cloud.getResourceNames(type)
|
446
446
|
|
447
447
|
resource['dependencies'].each { |dep|
|
448
448
|
if dep['type'] == cfg_name and dep['name'].to_s == name.to_s
|
449
|
-
dep["
|
450
|
-
dep["
|
449
|
+
dep["their_phase"] = their_phase if their_phase
|
450
|
+
dep["my_phase"] = my_phase if my_phase
|
451
451
|
return
|
452
452
|
end
|
453
453
|
}
|
454
454
|
|
455
455
|
newdep = {
|
456
456
|
"type" => cfg_name,
|
457
|
-
"name" => name.to_s
|
458
|
-
"no_create_wait" => no_create_wait
|
457
|
+
"name" => name.to_s
|
459
458
|
}
|
460
|
-
newdep["
|
459
|
+
newdep["their_phase"] = their_phase if their_phase
|
460
|
+
newdep["my_phase"] = my_phase if my_phase
|
461
461
|
|
462
462
|
resource['dependencies'] << newdep
|
463
463
|
|
@@ -746,7 +746,7 @@ module MU
|
|
746
746
|
next if !acl_include["name"] and !acl_include["rule_name"]
|
747
747
|
acl_include["name"] ||= acl_include["rule_name"]
|
748
748
|
if haveLitterMate?(acl_include["name"], "firewall_rules")
|
749
|
-
MU::Config.addDependency(descriptor, acl_include["name"], "firewall_rule",
|
749
|
+
MU::Config.addDependency(descriptor, acl_include["name"], "firewall_rule", my_phase: ((cfg_name == "vpc") ? "groom" : "create"))
|
750
750
|
elsif acl_include["name"]
|
751
751
|
MU.log shortclass.to_s+" #{descriptor['name']} depends on FirewallRule #{acl_include["name"]}, but no such rule declared.", MU::ERR
|
752
752
|
ok = false
|
@@ -892,6 +892,10 @@ module MU
|
|
892
892
|
deleteme = []
|
893
893
|
|
894
894
|
resource["dependencies"].each { |dependency|
|
895
|
+
dependency["their_phase"] ||= dependency["phase"]
|
896
|
+
dependency.delete("phase")
|
897
|
+
dependency["my_phase"] ||= dependency["no_create_wait"] ? "groom" : "create"
|
898
|
+
dependency.delete("no_create_wait")
|
895
899
|
# make sure the thing we depend on really exists
|
896
900
|
sibling = haveLitterMate?(dependency['name'], dependency['type'])
|
897
901
|
if !sibling
|
@@ -929,10 +933,22 @@ module MU
|
|
929
933
|
end
|
930
934
|
end
|
931
935
|
|
936
|
+
if dependency['their_phase'] == "groom"
|
937
|
+
sibling['dependencies'].each { |sib_dep|
|
938
|
+
next if sib_dep['type'] != cfg_name or sib_dep['their_phase'] != "groom"
|
939
|
+
cousin = haveLitterMate?(sib_dep['name'], sib_dep['type'])
|
940
|
+
if cousin and cousin['name'] == resource['name']
|
941
|
+
MU.log "Circular dependency between #{type} #{resource['name']} <=> #{dependency['type']} #{dependency['name']}", MU::ERR, details: [ resource['name'] => dependency, sibling['name'] => sib_dep ]
|
942
|
+
ok = false
|
943
|
+
end
|
944
|
+
}
|
945
|
+
end
|
946
|
+
|
932
947
|
# Check for a circular relationship that will lead to a deadlock
|
933
948
|
# when creating resource. This only goes one layer deep, and does
|
934
949
|
# not consider groom-phase deadlocks.
|
935
|
-
if dependency['
|
950
|
+
if dependency['their_phase'] == "groom" or
|
951
|
+
dependency['my_phase'] == "groom" or (
|
936
952
|
!MU::Cloud.resourceClass(sibling['cloud'], type).deps_wait_on_my_creation and
|
937
953
|
!MU::Cloud.resourceClass(resource['cloud'], type).waits_on_parent_completion
|
938
954
|
)
|
@@ -941,7 +957,7 @@ module MU
|
|
941
957
|
|
942
958
|
if sibling['dependencies']
|
943
959
|
sibling['dependencies'].each { |sib_dep|
|
944
|
-
next if sib_dep['type'] != cfg_name or sib_dep['
|
960
|
+
next if sib_dep['type'] != cfg_name or sib_dep['my_phase'] == "groom"
|
945
961
|
cousin = haveLitterMate?(sib_dep['name'], sib_dep['type'])
|
946
962
|
if cousin and cousin['name'] == resource['name']
|
947
963
|
MU.log "Circular dependency between #{type} #{resource['name']} <=> #{dependency['type']} #{dependency['name']}", MU::ERR, details: [ resource['name'] => dependency, sibling['name'] => sib_dep ]
|
@@ -1238,7 +1254,7 @@ module MU
|
|
1238
1254
|
"port" => db["port"],
|
1239
1255
|
"sgs" => [cfg_name+server['name']]
|
1240
1256
|
}
|
1241
|
-
MU::Config.addDependency(ruleset, cfg_name+server['name'], "firewall_rule",
|
1257
|
+
MU::Config.addDependency(ruleset, cfg_name+server['name'], "firewall_rule", my_phase: "groom")
|
1242
1258
|
end
|
1243
1259
|
}
|
1244
1260
|
}
|