cloud-mu 3.1.5 → 3.1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Dockerfile +5 -1
- data/ansible/roles/mu-windows/files/LaunchConfig.json +9 -0
- data/ansible/roles/mu-windows/files/config.xml +76 -0
- data/ansible/roles/mu-windows/tasks/main.yml +16 -0
- data/bin/mu-adopt +2 -1
- data/bin/mu-configure +16 -0
- data/bin/mu-node-manage +15 -16
- data/cloud-mu.gemspec +2 -2
- data/cookbooks/mu-activedirectory/resources/domain.rb +4 -4
- data/cookbooks/mu-activedirectory/resources/domain_controller.rb +4 -4
- data/cookbooks/mu-tools/recipes/eks.rb +2 -2
- data/cookbooks/mu-tools/recipes/windows-client.rb +25 -22
- data/extras/clean-stock-amis +25 -19
- data/extras/image-generators/AWS/win2k12.yaml +2 -0
- data/extras/image-generators/AWS/win2k16.yaml +2 -0
- data/extras/image-generators/AWS/win2k19.yaml +2 -0
- data/modules/mommacat.ru +1 -1
- data/modules/mu.rb +6 -5
- data/modules/mu/adoption.rb +19 -4
- data/modules/mu/cleanup.rb +181 -293
- data/modules/mu/cloud.rb +58 -17
- data/modules/mu/clouds/aws.rb +36 -1
- data/modules/mu/clouds/aws/container_cluster.rb +30 -21
- data/modules/mu/clouds/aws/role.rb +1 -1
- data/modules/mu/clouds/aws/vpc.rb +5 -1
- data/modules/mu/clouds/azure.rb +10 -0
- data/modules/mu/clouds/cloudformation.rb +10 -0
- data/modules/mu/clouds/google.rb +18 -4
- data/modules/mu/clouds/google/bucket.rb +2 -2
- data/modules/mu/clouds/google/container_cluster.rb +10 -7
- data/modules/mu/clouds/google/database.rb +3 -3
- data/modules/mu/clouds/google/firewall_rule.rb +3 -3
- data/modules/mu/clouds/google/function.rb +3 -3
- data/modules/mu/clouds/google/loadbalancer.rb +4 -4
- data/modules/mu/clouds/google/role.rb +18 -9
- data/modules/mu/clouds/google/server.rb +16 -14
- data/modules/mu/clouds/google/server_pool.rb +4 -4
- data/modules/mu/clouds/google/user.rb +2 -2
- data/modules/mu/clouds/google/vpc.rb +9 -13
- data/modules/mu/config.rb +1 -1
- data/modules/mu/config/container_cluster.rb +5 -0
- data/modules/mu/config/doc_helpers.rb +1 -1
- data/modules/mu/config/ref.rb +12 -6
- data/modules/mu/config/schema_helpers.rb +8 -3
- data/modules/mu/config/server.rb +7 -0
- data/modules/mu/config/tail.rb +1 -0
- data/modules/mu/config/vpc.rb +15 -7
- data/modules/mu/config/vpc.yml +0 -1
- data/modules/mu/defaults/AWS.yaml +48 -48
- data/modules/mu/deploy.rb +1 -1
- data/modules/mu/groomer.rb +1 -1
- data/modules/mu/groomers/ansible.rb +69 -4
- data/modules/mu/groomers/chef.rb +48 -4
- data/modules/mu/master.rb +75 -3
- data/modules/mu/mommacat.rb +104 -855
- data/modules/mu/mommacat/naming.rb +28 -0
- data/modules/mu/mommacat/search.rb +463 -0
- data/modules/mu/mommacat/storage.rb +185 -183
- data/modules/tests/super_simple_bok.yml +1 -3
- metadata +8 -5
@@ -474,7 +474,6 @@ module MU
|
|
474
474
|
MU.log %Q{How to interact with your GKE cluster\nkubectl --kubeconfig "#{kube_conf}" get events --all-namespaces\nkubectl --kubeconfig "#{kube_conf}" get all\nkubectl --kubeconfig "#{kube_conf}" create -f some_k8s_deploy.yml\nkubectl --kubeconfig "#{kube_conf}" get nodes}, MU::SUMMARY
|
475
475
|
end
|
476
476
|
|
477
|
-
|
478
477
|
# Locate an existing ContainerCluster or ContainerClusters and return an array containing matching GCP resource descriptors for those that match.
|
479
478
|
# @return [Array<Hash<String,OpenStruct>>]: The cloud provider's complete descriptions of matching ContainerClusters
|
480
479
|
def self.find(**args)
|
@@ -747,15 +746,15 @@ module MU
|
|
747
746
|
# @return [void]
|
748
747
|
def self.cleanup(noop: false, ignoremaster: false, region: MU.curRegion, credentials: nil, flags: {})
|
749
748
|
|
750
|
-
flags["
|
751
|
-
return if !MU::Cloud::Google::Habitat.isLive?(flags["
|
749
|
+
flags["habitat"] ||= MU::Cloud::Google.defaultProject(credentials)
|
750
|
+
return if !MU::Cloud::Google::Habitat.isLive?(flags["habitat"], credentials)
|
752
751
|
clusters = []
|
753
752
|
|
754
753
|
# Make sure we catch regional *and* zone clusters
|
755
|
-
found = MU::Cloud::Google.container(credentials: credentials).list_project_location_clusters("projects/#{flags['
|
754
|
+
found = MU::Cloud::Google.container(credentials: credentials).list_project_location_clusters("projects/#{flags['habitat']}/locations/#{region}")
|
756
755
|
clusters.concat(found.clusters) if found and found.clusters
|
757
756
|
MU::Cloud::Google.listAZs(region).each { |az|
|
758
|
-
found = MU::Cloud::Google.container(credentials: credentials).list_project_location_clusters("projects/#{flags['
|
757
|
+
found = MU::Cloud::Google.container(credentials: credentials).list_project_location_clusters("projects/#{flags['habitat']}/locations/#{az}")
|
759
758
|
clusters.concat(found.clusters) if found and found.clusters
|
760
759
|
}
|
761
760
|
|
@@ -1097,7 +1096,7 @@ module MU
|
|
1097
1096
|
}
|
1098
1097
|
if !match
|
1099
1098
|
MU.log "No version matching #{cluster['kubernetes']['version']} available, will try floating minor revision", MU::WARN
|
1100
|
-
cluster['kubernetes']['version'].sub!(/^(\d+\.\d
|
1099
|
+
cluster['kubernetes']['version'].sub!(/^(\d+\.\d+)\..*/i, '\1')
|
1101
1100
|
master_versions.each { |v|
|
1102
1101
|
if v.match(/^#{Regexp.quote(cluster['kubernetes']['version'])}/)
|
1103
1102
|
match = true
|
@@ -1145,6 +1144,10 @@ module MU
|
|
1145
1144
|
cluster['instance_type'] = MU::Cloud::Google::Server.validateInstanceType(cluster["instance_type"], cluster["region"], project: cluster['project'], credentials: cluster['credentials'])
|
1146
1145
|
ok = false if cluster['instance_type'].nil?
|
1147
1146
|
|
1147
|
+
if !MU::Master.kubectl
|
1148
|
+
MU.log "Since I can't find a kubectl executable, you will have to handle all service account, user, and role bindings manually!", MU::WARN
|
1149
|
+
end
|
1150
|
+
|
1148
1151
|
ok
|
1149
1152
|
end
|
1150
1153
|
|
@@ -1236,7 +1239,7 @@ module MU
|
|
1236
1239
|
# Take this opportunity to ensure that the 'client' service account
|
1237
1240
|
# used by certificate authentication exists and has appropriate
|
1238
1241
|
# privilege
|
1239
|
-
if @username and @password
|
1242
|
+
if @username and @password and MU::Master.kubectl
|
1240
1243
|
File.open(client_binding, "w"){ |k|
|
1241
1244
|
k.puts <<-EOF
|
1242
1245
|
kind: ClusterRoleBinding
|
@@ -108,13 +108,13 @@ module MU
|
|
108
108
|
# @param region [String]: The cloud provider region in which to operate
|
109
109
|
# @return [void]
|
110
110
|
def self.cleanup(noop: false, ignoremaster: false, region: MU.curRegion, credentials: nil, flags: {})
|
111
|
-
flags["
|
111
|
+
flags["habitat"] ||= MU::Cloud::Google.defaultProject(credentials)
|
112
112
|
|
113
|
-
# instances = MU::Cloud::Google.sql(credentials: credentials).list_instances(flags['
|
113
|
+
# instances = MU::Cloud::Google.sql(credentials: credentials).list_instances(flags['habitat'], filter: %Q{userLabels.mu-id:"#{MU.deploy_id.downcase}"})
|
114
114
|
# if instances and instances.items
|
115
115
|
# instances.items.each { |instance|
|
116
116
|
# MU.log "Deleting Cloud SQL instance #{instance.name}"
|
117
|
-
# MU::Cloud::Google.sql(credentials: credentials).delete_instance(flags['
|
117
|
+
# MU::Cloud::Google.sql(credentials: credentials).delete_instance(flags['habitat'], instance.name) if !noop
|
118
118
|
# }
|
119
119
|
# end
|
120
120
|
end
|
@@ -208,8 +208,8 @@ end
|
|
208
208
|
# @param ignoremaster [Boolean]: If true, will remove resources not flagged as originating from this Mu server
|
209
209
|
# @return [void]
|
210
210
|
def self.cleanup(noop: false, ignoremaster: false, credentials: nil, flags: {})
|
211
|
-
flags["
|
212
|
-
return if !MU::Cloud::Google::Habitat.isLive?(flags["
|
211
|
+
flags["habitat"] ||= MU::Cloud::Google.defaultProject(credentials)
|
212
|
+
return if !MU::Cloud::Google::Habitat.isLive?(flags["habitat"], credentials)
|
213
213
|
filter = %Q{(labels.mu-id = "#{MU.deploy_id.downcase}")}
|
214
214
|
if !ignoremaster and MU.mu_public_ip
|
215
215
|
filter += %Q{ AND (labels.mu-master-ip = "#{MU.mu_public_ip.gsub(/\./, "_")}")}
|
@@ -218,7 +218,7 @@ end
|
|
218
218
|
|
219
219
|
MU::Cloud::Google.compute(credentials: credentials).delete(
|
220
220
|
"firewall",
|
221
|
-
flags["
|
221
|
+
flags["habitat"],
|
222
222
|
nil,
|
223
223
|
noop
|
224
224
|
)
|
@@ -234,10 +234,10 @@ module example.com/cloudfunction
|
|
234
234
|
# @param region [String]: The cloud provider region
|
235
235
|
# @return [void]
|
236
236
|
def self.cleanup(noop: false, ignoremaster: false, region: MU.curRegion, credentials: nil, flags: {})
|
237
|
-
flags["
|
238
|
-
return if !MU::Cloud::Google::Habitat.isLive?(flags["
|
237
|
+
flags["habitat"] ||= MU::Cloud::Google.defaultProject(credentials)
|
238
|
+
return if !MU::Cloud::Google::Habitat.isLive?(flags["habitat"], credentials)
|
239
239
|
# Make sure we catch regional *and* zone functions
|
240
|
-
found = MU::Cloud::Google::Function.find(credentials: credentials, region: region, project: flags["
|
240
|
+
found = MU::Cloud::Google::Function.find(credentials: credentials, region: region, project: flags["habitat"])
|
241
241
|
found.each_pair { |cloud_id, desc|
|
242
242
|
if (desc.description and desc.description == MU.deploy_id) or
|
243
243
|
(desc.labels and desc.labels["mu-id"] == MU.deploy_id.downcase and (ignoremaster or desc.labels["mu-master-ip"] == MU.mu_public_ip.gsub(/\./, "_"))) or
|
@@ -147,8 +147,8 @@ module MU
|
|
147
147
|
# @param region [String]: The cloud provider region
|
148
148
|
# @return [void]
|
149
149
|
def self.cleanup(noop: false, ignoremaster: false, region: nil, credentials: nil, flags: {})
|
150
|
-
flags["
|
151
|
-
return if !MU::Cloud::Google::Habitat.isLive?(flags["
|
150
|
+
flags["habitat"] ||= MU::Cloud::Google.defaultProject(credentials)
|
151
|
+
return if !MU::Cloud::Google::Habitat.isLive?(flags["habitat"], credentials)
|
152
152
|
filter = %Q{(labels.mu-id = "#{MU.deploy_id.downcase}")}
|
153
153
|
if !ignoremaster and MU.mu_public_ip
|
154
154
|
filter += %Q{ AND (labels.mu-master-ip = "#{MU.mu_public_ip.gsub(/\./, "_")}")}
|
@@ -159,7 +159,7 @@ module MU
|
|
159
159
|
["forwarding_rule", "region_backend_service"].each { |type|
|
160
160
|
MU::Cloud::Google.compute(credentials: credentials).delete(
|
161
161
|
type,
|
162
|
-
flags["
|
162
|
+
flags["habitat"],
|
163
163
|
region,
|
164
164
|
noop
|
165
165
|
)
|
@@ -170,7 +170,7 @@ module MU
|
|
170
170
|
["global_forwarding_rule", "target_http_proxy", "target_https_proxy", "url_map", "backend_service", "health_check", "http_health_check", "https_health_check"].each { |type|
|
171
171
|
MU::Cloud::Google.compute(credentials: credentials).delete(
|
172
172
|
type,
|
173
|
-
flags["
|
173
|
+
flags["habitat"],
|
174
174
|
nil,
|
175
175
|
noop
|
176
176
|
)
|
@@ -731,25 +731,34 @@ module MU
|
|
731
731
|
bindings[scopetype].each_pair { |scope_id, entity_types|
|
732
732
|
# If we've been given a habitat filter, skip over bindings
|
733
733
|
# that don't match it.
|
734
|
-
if scopetype == "projects"
|
735
|
-
|
736
|
-
|
737
|
-
|
734
|
+
if scopetype == "projects"
|
735
|
+
if (args[:habitats] and !args[:habitats].empty? and
|
736
|
+
!args[:habitats].include?(scope_id)) or
|
737
|
+
!MU::Cloud::Google.listHabitats(@credentials).include?(scope_id)
|
738
|
+
next
|
739
|
+
end
|
738
740
|
end
|
739
741
|
|
740
742
|
entity_types.each_pair { |entity_type, entities|
|
741
743
|
mu_entitytype = (entity_type == "serviceAccount" ? "user" : entity_type)+"s"
|
742
744
|
entities.each { |entity|
|
745
|
+
foreign = if entity_type == "serviceAccount" and entity.match(/@(.*?)\.iam\.gserviceaccount\.com/)
|
746
|
+
!MU::Cloud::Google.listHabitats(@credentials).include?(Regexp.last_match[1])
|
747
|
+
end
|
743
748
|
entity_ref = if entity_type == "organizations"
|
744
749
|
{ "id" => ((org == my_org.name and @config['credentials']) ? @config['credentials'] : org) }
|
745
750
|
elsif entity_type == "domain"
|
746
751
|
{ "id" => entity }
|
747
752
|
else
|
748
|
-
|
749
|
-
id
|
750
|
-
|
751
|
-
|
752
|
-
|
753
|
+
if foreign
|
754
|
+
{ "id" => entity }
|
755
|
+
else
|
756
|
+
MU::Config::Ref.get(
|
757
|
+
id: entity,
|
758
|
+
cloud: "Google",
|
759
|
+
type: mu_entitytype
|
760
|
+
)
|
761
|
+
end
|
753
762
|
end
|
754
763
|
refmap ||= {}
|
755
764
|
refmap[entity_ref] ||= {}
|
@@ -1016,7 +1016,6 @@ next if !create
|
|
1016
1016
|
item: @config['windows_auth_vault']['item'],
|
1017
1017
|
field: @config["windows_auth_vault"]["password_field"]
|
1018
1018
|
)
|
1019
|
-
MU.log "RETURNINATING FROM CACHE", MU::WARN, details: win_admin_password
|
1020
1019
|
return win_admin_password if win_admin_password
|
1021
1020
|
rescue MU::Groomer::MuNoSuchSecret, MU::Groomer::RunError
|
1022
1021
|
end
|
@@ -1276,8 +1275,8 @@ MU.log "RETURNINATING FROM CACHE", MU::WARN, details: win_admin_password
|
|
1276
1275
|
# @param region [String]: The cloud provider region
|
1277
1276
|
# @return [void]
|
1278
1277
|
def self.cleanup(noop: false, ignoremaster: false, region: MU.curRegion, credentials: nil, flags: {})
|
1279
|
-
flags["
|
1280
|
-
return if !MU::Cloud::Google::Habitat.isLive?(flags["
|
1278
|
+
flags["habitat"] ||= MU::Cloud::Google.defaultProject(credentials)
|
1279
|
+
return if !MU::Cloud::Google::Habitat.isLive?(flags["habitat"], credentials)
|
1281
1280
|
|
1282
1281
|
# XXX make damn sure MU.deploy_id is set
|
1283
1282
|
filter = %Q{(labels.mu-id = "#{MU.deploy_id.downcase}")}
|
@@ -1288,13 +1287,12 @@ MU.log "RETURNINATING FROM CACHE", MU::WARN, details: win_admin_password
|
|
1288
1287
|
MU::Cloud::Google.listAZs(region).each { |az|
|
1289
1288
|
disks = []
|
1290
1289
|
resp = MU::Cloud::Google.compute(credentials: credentials).list_instances(
|
1291
|
-
flags["
|
1290
|
+
flags["habitat"],
|
1292
1291
|
az,
|
1293
1292
|
filter: filter
|
1294
1293
|
)
|
1295
1294
|
if !resp.items.nil? and resp.items.size > 0
|
1296
1295
|
resp.items.each { |instance|
|
1297
|
-
saname = instance.tags.items.first.gsub(/[^a-z]/, "") # XXX this nonsense again
|
1298
1296
|
MU.log "Terminating instance #{instance.name}"
|
1299
1297
|
if !instance.disks.nil? and instance.disks.size > 0
|
1300
1298
|
instance.disks.each { |disk|
|
@@ -1302,17 +1300,21 @@ MU.log "RETURNINATING FROM CACHE", MU::WARN, details: win_admin_password
|
|
1302
1300
|
}
|
1303
1301
|
end
|
1304
1302
|
MU::Cloud::Google.compute(credentials: credentials).delete_instance(
|
1305
|
-
flags["
|
1303
|
+
flags["habitat"],
|
1306
1304
|
az,
|
1307
1305
|
instance.name
|
1308
1306
|
) if !noop
|
1309
|
-
|
1310
|
-
|
1311
|
-
|
1312
|
-
|
1313
|
-
|
1314
|
-
|
1315
|
-
|
1307
|
+
if instance.service_accounts
|
1308
|
+
instance.service_accounts.each { |sa|
|
1309
|
+
MU.log "Removing service account #{sa.email}"
|
1310
|
+
begin
|
1311
|
+
MU::Cloud::Google.iam(credentials: credentials).delete_project_service_account(
|
1312
|
+
"projects/#{flags["habitat"]}/serviceAccounts/#{sa.email}"
|
1313
|
+
) if !noop
|
1314
|
+
rescue ::Google::Apis::ClientError => e
|
1315
|
+
raise e if !e.message.match(/^notFound: /)
|
1316
|
+
end
|
1317
|
+
}
|
1316
1318
|
end
|
1317
1319
|
# XXX wait-loop on pending?
|
1318
1320
|
# pp deletia
|
@@ -1325,7 +1327,7 @@ MU.log "RETURNINATING FROM CACHE", MU::WARN, details: win_admin_password
|
|
1325
1327
|
# XXX honor snapshotting
|
1326
1328
|
MU::Cloud::Google.compute(credentials: credentials).delete(
|
1327
1329
|
"disk",
|
1328
|
-
flags["
|
1330
|
+
flags["habitat"],
|
1329
1331
|
az,
|
1330
1332
|
noop
|
1331
1333
|
) if !noop
|
@@ -432,8 +432,8 @@ end
|
|
432
432
|
# @param region [String]: The cloud provider region
|
433
433
|
# @return [void]
|
434
434
|
def self.cleanup(noop: false, ignoremaster: false, region: MU.curRegion, credentials: nil, flags: {})
|
435
|
-
flags["
|
436
|
-
return if !MU::Cloud::Google::Habitat.isLive?(flags["
|
435
|
+
flags["habitat"] ||= MU::Cloud::Google.defaultProject(credentials)
|
436
|
+
return if !MU::Cloud::Google::Habitat.isLive?(flags["habitat"], credentials)
|
437
437
|
filter = %Q{(labels.mu-id = "#{MU.deploy_id.downcase}")}
|
438
438
|
if !ignoremaster and MU.mu_public_ip
|
439
439
|
filter += %Q{ AND (labels.mu-master-ip = "#{MU.mu_public_ip.gsub(/\./, "_")}")}
|
@@ -444,7 +444,7 @@ end
|
|
444
444
|
["region_autoscaler", "region_instance_group_manager"].each { |type|
|
445
445
|
MU::Cloud::Google.compute(credentials: credentials).delete(
|
446
446
|
type,
|
447
|
-
flags["
|
447
|
+
flags["habitat"],
|
448
448
|
region,
|
449
449
|
noop
|
450
450
|
)
|
@@ -452,7 +452,7 @@ end
|
|
452
452
|
else
|
453
453
|
MU::Cloud::Google.compute(credentials: credentials).delete(
|
454
454
|
"instance_template",
|
455
|
-
flags["
|
455
|
+
flags["habitat"],
|
456
456
|
noop
|
457
457
|
)
|
458
458
|
end
|
@@ -281,9 +281,9 @@ module MU
|
|
281
281
|
end
|
282
282
|
end
|
283
283
|
|
284
|
-
flags["
|
284
|
+
flags["habitat"] ||= MU::Cloud::Google.defaultProject(credentials)
|
285
285
|
resp = MU::Cloud::Google.iam(credentials: credentials).list_project_service_accounts(
|
286
|
-
"projects/"+flags["
|
286
|
+
"projects/"+flags["habitat"]
|
287
287
|
)
|
288
288
|
|
289
289
|
if resp and resp.accounts and MU.deploy_id
|
@@ -113,7 +113,7 @@ module MU
|
|
113
113
|
# Describe this VPC
|
114
114
|
# @return [Hash]
|
115
115
|
def notify
|
116
|
-
base = MU.structToHash(cloud_desc)
|
116
|
+
base = MU.structToHash(cloud_desc, stringify_keys: true)
|
117
117
|
base["cloud_id"] = @cloud_id
|
118
118
|
base["project_id"] = habitat_id
|
119
119
|
base.merge!(@config.to_h)
|
@@ -301,14 +301,10 @@ end
|
|
301
301
|
@deploy.deployment["vpcs"][@config['name']]["subnets"] and
|
302
302
|
@deploy.deployment["vpcs"][@config['name']]["subnets"].size > 0
|
303
303
|
@deploy.deployment["vpcs"][@config['name']]["subnets"].each { |desc|
|
304
|
-
subnet =
|
305
|
-
subnet["ip_block"] = desc['ip_block']
|
306
|
-
subnet["name"] = desc["name"]
|
304
|
+
subnet = desc.clone
|
307
305
|
subnet['mu_name'] = @config['scrub_mu_isms'] ? @cloud_id+subnet['name'].downcase : MU::Cloud::Google.nameStr(@deploy.getResourceName(subnet['name'], max_length: 61))
|
308
|
-
subnet["cloud_id"] = desc['cloud_id']
|
309
306
|
subnet["cloud_id"] ||= desc['self_link'].gsub(/.*?\/([^\/]+)$/, '\1')
|
310
307
|
subnet["cloud_id"] ||= subnet['mu_name']
|
311
|
-
subnet['az'] = desc["az"]
|
312
308
|
subnet['az'] ||= desc["region"].gsub(/.*?\/([^\/]+)$/, '\1')
|
313
309
|
@subnets << MU::Cloud::Google::VPC::Subnet.new(self, subnet, precache_description: false)
|
314
310
|
}
|
@@ -542,15 +538,15 @@ MU.log "ROUTES TO #{target_instance.name}", MU::WARN, details: resp
|
|
542
538
|
# @param ignoremaster [Boolean]: If true, will remove resources not flagged as originating from this Mu server
|
543
539
|
# @return [void]
|
544
540
|
def self.cleanup(noop: false, ignoremaster: false, credentials: nil, flags: {})
|
545
|
-
flags["
|
546
|
-
return if !MU::Cloud::Google::Habitat.isLive?(flags["
|
541
|
+
flags["habitat"] ||= MU::Cloud::Google.defaultProject(credentials)
|
542
|
+
return if !MU::Cloud::Google::Habitat.isLive?(flags["habitat"], credentials)
|
547
543
|
filter = %Q{(labels.mu-id = "#{MU.deploy_id.downcase}")}
|
548
544
|
if !ignoremaster and MU.mu_public_ip
|
549
545
|
filter += %Q{ AND (labels.mu-master-ip = "#{MU.mu_public_ip.gsub(/\./, "_")}")}
|
550
546
|
end
|
551
547
|
MU.log "Placeholder: Google VPC artifacts do not support labels, so ignoremaster cleanup flag has no effect", MU::DEBUG, details: filter
|
552
548
|
|
553
|
-
purge_subnets(noop, project: flags['
|
549
|
+
purge_subnets(noop, project: flags['habitat'], credentials: credentials)
|
554
550
|
["route", "network"].each { |type|
|
555
551
|
# XXX tagged routes aren't showing up in list, and the networks that own them
|
556
552
|
# fail to delete silently
|
@@ -559,7 +555,7 @@ MU.log "ROUTES TO #{target_instance.name}", MU::WARN, details: resp
|
|
559
555
|
begin
|
560
556
|
MU::Cloud::Google.compute(credentials: credentials).delete(
|
561
557
|
type,
|
562
|
-
flags["
|
558
|
+
flags["habitat"],
|
563
559
|
nil,
|
564
560
|
noop
|
565
561
|
)
|
@@ -569,13 +565,13 @@ MU.log "ROUTES TO #{target_instance.name}", MU::WARN, details: resp
|
|
569
565
|
MU.log e.message, MU::WARN
|
570
566
|
if e.message.match(/Failed to delete network (.+)/)
|
571
567
|
network_name = Regexp.last_match[1]
|
572
|
-
fwrules = MU::Cloud::Google::FirewallRule.find(project: flags['
|
568
|
+
fwrules = MU::Cloud::Google::FirewallRule.find(project: flags['habitat'], credentials: credentials)
|
573
569
|
fwrules.reject! { |_name, desc|
|
574
570
|
!desc.network.match(/.*?\/#{Regexp.quote(network_name)}$/)
|
575
571
|
}
|
576
572
|
fwrules.keys.each { |name|
|
577
573
|
MU.log "Attempting to delete firewall rule #{name} so that VPC #{network_name} can be removed", MU::NOTICE
|
578
|
-
MU::Cloud::Google.compute(credentials: credentials).delete_firewall(flags['
|
574
|
+
MU::Cloud::Google.compute(credentials: credentials).delete_firewall(flags['habitat'], name)
|
579
575
|
}
|
580
576
|
end
|
581
577
|
end
|
@@ -1120,7 +1116,7 @@ MU.log "ROUTES TO #{target_instance.name}", MU::WARN, details: resp
|
|
1120
1116
|
# Describe this VPC Subnet
|
1121
1117
|
# @return [Hash]
|
1122
1118
|
def notify
|
1123
|
-
MU.structToHash(cloud_desc)
|
1119
|
+
MU.structToHash(cloud_desc, stringify_keys: true)
|
1124
1120
|
end
|
1125
1121
|
|
1126
1122
|
# Return the +self_link+ to this subnet
|
data/modules/mu/config.rb
CHANGED
@@ -77,7 +77,7 @@ module MU
|
|
77
77
|
if config.is_a?(Hash)
|
78
78
|
newhash = {}
|
79
79
|
config.each_pair { |key, val|
|
80
|
-
next if remove_runtime_keys and key.match(/^#MU_/)
|
80
|
+
next if remove_runtime_keys and (key.nil? or key.match(/^#MU_/))
|
81
81
|
next if val.is_a?(Array) and val.empty?
|
82
82
|
newhash[key] = self.manxify(val, remove_runtime_keys: remove_runtime_keys)
|
83
83
|
}
|
@@ -104,6 +104,11 @@ module MU
|
|
104
104
|
cluster["min_size"] ||= [cluster["instance_count"], cluster["min_size"]].reject { |c| c.nil? }.min
|
105
105
|
end
|
106
106
|
|
107
|
+
if cluster['kubernetes_resources'] and !MU::Master.kubectl
|
108
|
+
MU.log "Cannot apply kubernetes resources without a working kubectl executable", MU::ERR
|
109
|
+
ok = false
|
110
|
+
end
|
111
|
+
|
107
112
|
ok
|
108
113
|
end
|
109
114
|
|
@@ -239,7 +239,7 @@ $CONFIGURABLES
|
|
239
239
|
|
240
240
|
if class_hierarchy.size == 1
|
241
241
|
|
242
|
-
_shortclass, cfg_name, cfg_plural, _classname = MU::Cloud.getResourceNames(name)
|
242
|
+
_shortclass, cfg_name, cfg_plural, _classname = MU::Cloud.getResourceNames(name, false)
|
243
243
|
if cfg_name
|
244
244
|
example_path = MU.myRoot+"/modules/mu/config/"+cfg_name+".yml"
|
245
245
|
if File.exist?(example_path)
|
data/modules/mu/config/ref.rb
CHANGED
@@ -255,7 +255,7 @@ module MU
|
|
255
255
|
if @obj
|
256
256
|
@deploy_id ||= @obj.deploy_id
|
257
257
|
@id ||= @obj.cloud_id
|
258
|
-
@name ||= @obj.config['name']
|
258
|
+
@name ||= @obj.config['name'] if @obj.config
|
259
259
|
return @obj
|
260
260
|
end
|
261
261
|
|
@@ -266,6 +266,7 @@ module MU
|
|
266
266
|
@mommacat ||= mommacat
|
267
267
|
@obj.intoDeploy(@mommacat) # make real sure these are set
|
268
268
|
@deploy_id ||= mommacat.deploy_id
|
269
|
+
|
269
270
|
if !@name
|
270
271
|
if @obj.config and @obj.config['name']
|
271
272
|
@name = @obj.config['name']
|
@@ -283,6 +284,7 @@ end
|
|
283
284
|
end
|
284
285
|
|
285
286
|
if !@obj and !(@cloud == "Google" and @id and @type == "users" and MU::Cloud::Google::User.cannedServiceAcctName?(@id)) and !shallow
|
287
|
+
try_deploy_id = @deploy_id
|
286
288
|
|
287
289
|
begin
|
288
290
|
hab_arg = if @habitat.nil?
|
@@ -300,22 +302,26 @@ end
|
|
300
302
|
@type,
|
301
303
|
name: @name,
|
302
304
|
cloud_id: @id,
|
303
|
-
deploy_id:
|
305
|
+
deploy_id: try_deploy_id,
|
304
306
|
region: @region,
|
305
307
|
habitats: hab_arg,
|
306
308
|
credentials: @credentials,
|
307
309
|
dummy_ok: (["habitats", "folders", "users", "groups", "vpcs"].include?(@type))
|
308
310
|
)
|
309
311
|
@obj ||= found.first if found
|
312
|
+
rescue MU::MommaCat::MultipleMatches => e
|
313
|
+
if try_deploy_id.nil? and MU.deploy_id
|
314
|
+
MU.log "Attempting to narrow down #{@cloud} #{@type} to #{MU.deploy_id}", MU::NOTICE
|
315
|
+
try_deploy_id = MU.deploy_id
|
316
|
+
retry
|
317
|
+
else
|
318
|
+
raise e
|
319
|
+
end
|
310
320
|
rescue ThreadError => e
|
311
321
|
# Sometimes MommaCat calls us in a potential deadlock situation;
|
312
322
|
# don't be the cause of a fatal error if so, we don't need this
|
313
323
|
# object that badly.
|
314
324
|
raise e if !e.message.match(/recursive locking/)
|
315
|
-
rescue SystemExit
|
316
|
-
# XXX this is temporary, to cope with some debug stuff that's in findStray
|
317
|
-
# for the nonce
|
318
|
-
return
|
319
325
|
end
|
320
326
|
end
|
321
327
|
|