cloudstrap-azure 0.5.3.pre → 0.5.6.pre
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
- checksums.yaml.gz.sig +0 -0
- data/command/internal/cloudstrap-azure.deploy +175 -147
- data.tar.gz.sig +0 -0
- metadata +2 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 31f17b4b9f9f34e69fa72904329bfad979fdce50117b43270d0f8801918e9a26
|
4
|
+
data.tar.gz: dff144bd4fd98a6bbdb4c6a3a6c53c848e1861118a208a2b26dcf3cd36d52833
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a759e06aea172d7900626ca5150a5c832ca7d2331b1b7629c36509e5d653595167d4bd4b00b1d09bba2122da91fd8afbbdc6847d63e7720f9a631524e6c40d54
|
7
|
+
data.tar.gz: ae908e27d2d712e90ca0401cc3934dfa87daf2057666782fc9acdd273ed44aab50aefa99970910f400c2fa5491ecca2ecf33519a734df849c334259ce372f4b9
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
@@ -35,6 +35,7 @@ TENANT_ID = Chamber.env.tenant_id
|
|
35
35
|
LOCATION = Chamber.env.location
|
36
36
|
|
37
37
|
SPINNER_FORMAT = (Chamber.env[:spinner] || :arrow_pulse).to_sym
|
38
|
+
ARBITRARY_DELAY = (Chamber.env[:arbitrary_delay] || 10).to_i
|
38
39
|
|
39
40
|
ENABLE_SWAP_ACCOUNTING = %q{sudo sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT=\"console=tty1 console=ttyS0 earlyprintk=ttyS0 rootdelay=300\"/GRUB_CMDLINE_LINUX_DEFAULT=\"console=tty1 console=ttyS0 earlyprintk=ttyS0 rootdelay=300 swapaccount=1\"/g' /etc/default/grub.d/50-cloudimg-settings.cfg}
|
40
41
|
UPDATE_GRUB = %q{sudo update-grub}
|
@@ -61,12 +62,16 @@ If = ->(predicate, consequent, alternative = Nothing) {
|
|
61
62
|
predicate.(*arguments) ? consequent.(*arguments) : alternative.(*arguments) } }
|
62
63
|
ApplyIf = ->(predicate, consequent) { If.(predicate, consequent, Itself) }
|
63
64
|
|
64
|
-
|
65
|
+
LONGEST_MESSAGE = 30
|
66
|
+
|
67
|
+
WhileSpinning = lambda do |message, report: nil, &block|
|
65
68
|
Concurrent::IVar.new.tap do |ivar|
|
66
69
|
TTY::Spinner.new("[:spinner] #{message}", format: SPINNER_FORMAT).tap do |spinner|
|
67
70
|
spinner.auto_spin
|
68
71
|
ivar.set block.call
|
69
|
-
|
72
|
+
padding = (' ' * [(LONGEST_MESSAGE - message.length), 0].max)
|
73
|
+
ivar.value ? (report ? spinner.success(padding + ivar.value.public_send(report).to_s) : spinner.success) : spinner.error
|
74
|
+
end
|
70
75
|
end.value
|
71
76
|
end
|
72
77
|
|
@@ -218,112 +223,125 @@ BindTenantID = Bind.(:tenant_id, TENANT_ID)
|
|
218
223
|
########################
|
219
224
|
|
220
225
|
FindResourceGroup = ->(name) {
|
221
|
-
|
222
|
-
|
223
|
-
|
226
|
+
WhileSpinning.("Resource Group Exists", report: :name) {
|
227
|
+
AzureAPI::Resources::ResourceGroups
|
228
|
+
.list
|
229
|
+
.find { |resource_group| resource_group.id == "/subscriptions/#{SUBSCRIPTION_ID}/resourceGroups/#{name}" }}}
|
224
230
|
|
225
231
|
CreateResourceGroup = ->(name) {
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
232
|
+
WhileSpinning.("Create Resource Group", report: :name) {
|
233
|
+
AzureAPI::Resources::ResourceGroups.create_or_update(
|
234
|
+
name,
|
235
|
+
AzureAPI::Resources::Models::ResourceGroup.new.tap do |resource_group|
|
236
|
+
resource_group.location = LOCATION
|
237
|
+
end)}}
|
231
238
|
|
232
239
|
FindApplication = ->(display_name) {
|
233
|
-
|
234
|
-
|
235
|
-
|
240
|
+
WhileSpinning.("Application Exists", report: :app_id) {
|
241
|
+
AzureAPI::GraphRbac::Applications
|
242
|
+
.list
|
243
|
+
.find { |application| application.display_name == display_name }}}
|
236
244
|
|
237
245
|
CreateApplication = ->(display_name) {
|
238
|
-
|
239
|
-
AzureAPI::GraphRbac::
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
246
|
+
WhileSpinning.("Create Application", report: :app_id) {
|
247
|
+
AzureAPI::GraphRbac::Applications.create(
|
248
|
+
AzureAPI::GraphRbac::Models::ApplicationCreateParameters.new.tap do |application|
|
249
|
+
application.available_to_other_tenants = false
|
250
|
+
application.display_name = display_name
|
251
|
+
application.identifier_uris = ["http://#{display_name}"]
|
252
|
+
end)}}
|
244
253
|
|
245
254
|
FindServicePrincipal = ->(application) {
|
246
|
-
|
247
|
-
|
248
|
-
|
255
|
+
WhileSpinning.("Service Principal Exists", report: :object_id) {
|
256
|
+
AzureAPI::GraphRbac::ServicePrincipals
|
257
|
+
.list
|
258
|
+
.find { |service_principal| service_principal.app_id == application.app_id }}}
|
249
259
|
|
250
260
|
CreateServicePrincipal = ->(application) {
|
251
|
-
|
252
|
-
AzureAPI::GraphRbac::
|
253
|
-
|
254
|
-
|
255
|
-
|
261
|
+
WhileSpinning.("Create Service Principal", report: :object_id) {
|
262
|
+
AzureAPI::GraphRbac::ServicePrincipals.create(
|
263
|
+
AzureAPI::GraphRbac::Models::ServicePrincipalCreateParameters.new.tap do |service_principal|
|
264
|
+
service_principal.account_enabled = true
|
265
|
+
service_principal.app_id = application.app_id
|
266
|
+
end)}}
|
256
267
|
|
257
268
|
FindRoleDefinition = ->(role_name) {
|
258
|
-
|
259
|
-
|
260
|
-
|
269
|
+
WhileSpinning.("Role Definition Exists", report: :role_name) {
|
270
|
+
AzureAPI::Authorization::RoleDefinitions
|
271
|
+
.list("/subscriptions/#{SUBSCRIPTION_ID}")
|
272
|
+
.find { |role_definition| role_definition.role_name == role_name }}}
|
261
273
|
|
262
274
|
FindRoleAssignment = ->(name) {
|
263
|
-
|
264
|
-
|
265
|
-
|
275
|
+
WhileSpinning.("Role Assignment Exists", report: :name) {
|
276
|
+
AzureAPI::Authorization::RoleAssignments
|
277
|
+
.list
|
278
|
+
.find { |role_assignment| role_assignment.name == name }}}
|
266
279
|
|
267
280
|
CreateRoleAssignment = ->(role_definition, service_principal, resource_group) {
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
281
|
+
WhileSpinning.("Create Role Assignment", report: :name) {
|
282
|
+
AzureAPI::Authorization::RoleAssignments.create(
|
283
|
+
resource_group.id,
|
284
|
+
Chamber.env.uuid,
|
285
|
+
AzureAPI::Authorization::Models::RoleAssignmentCreateParameters.new.tap do |role_assignment|
|
286
|
+
role_assignment.role_definition_id = role_definition.id
|
287
|
+
role_assignment.principal_id = service_principal.object_id
|
288
|
+
end)}}
|
275
289
|
|
276
290
|
UpdatePassword = ->(service_principal, password) {
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
291
|
+
WhileSpinning.("Update Password") {
|
292
|
+
AzureAPI::GraphRbac::ServicePrincipals.update_password_credentials(
|
293
|
+
service_principal.object_id,
|
294
|
+
AzureAPI::GraphRbac::Models::PasswordCredentialsUpdateParameters.new.tap { |update|
|
295
|
+
update.value = [AzureAPI::GraphRbac::Models::PasswordCredential.new.tap { |credential|
|
296
|
+
credential.value = password
|
297
|
+
credential.end_date = Time.parse(
|
298
|
+
Chamber.env.credential_end_date).to_datetime}]})
|
299
|
+
true}}
|
284
300
|
|
285
301
|
FindContainerService = ->(resource_group) {
|
286
|
-
|
287
|
-
|
288
|
-
|
302
|
+
WhileSpinning.("Container Service Exists", report: :name) {
|
303
|
+
AzureAPI::ContainerService::ContainerServices
|
304
|
+
.list_by_resource_group(resource_group.name)
|
305
|
+
.find { |container_service| container_service.name == Chamber.env.identifier }}}
|
289
306
|
|
290
307
|
CreateContainerService = ->(service_principal, resource_group) {
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
.
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
308
|
+
WhileSpinning.("Create Container Service", report: :name) {
|
309
|
+
AzureAPI::ContainerService::ContainerServices.create_or_update(
|
310
|
+
resource_group.name,
|
311
|
+
Chamber.env.identifier,
|
312
|
+
AzureAPI::ContainerService::Models::ContainerService.new.tap { |container_service|
|
313
|
+
container_service.agent_pool_profiles = [
|
314
|
+
AzureAPI::ContainerService::Models::ContainerServiceAgentPoolProfile.new.tap { |agent_pool_profile|
|
315
|
+
agent_pool_profile.count = (
|
316
|
+
Chamber.env.agent_count)
|
317
|
+
agent_pool_profile.dns_prefix = (
|
318
|
+
[Chamber.env.dns_prefix, Chamber.env.agent_dns_suffix]
|
319
|
+
.join('-'))
|
320
|
+
agent_pool_profile.name = (
|
321
|
+
Chamber.env.identifier)
|
322
|
+
agent_pool_profile.vm_size = (
|
323
|
+
Chamber.env.vm_size)}]
|
324
|
+
container_service.linux_profile = (
|
325
|
+
AzureAPI::ContainerService::Models::ContainerServiceLinuxProfile.new.tap { |linux_profile|
|
326
|
+
linux_profile.admin_username = (
|
327
|
+
Chamber.env.admin_username)
|
328
|
+
linux_profile.ssh = (
|
329
|
+
AzureAPI::ContainerService::Models::ContainerServiceSshConfiguration.new.tap { |ssh|
|
330
|
+
ssh.public_keys = [
|
331
|
+
AzureAPI::ContainerService::Models::ContainerServiceSshPublicKey.new.tap { |public_key|
|
332
|
+
public_key.key_data = (
|
333
|
+
SSHKey.new(Chamber.env.ssh_private_key).ssh_public_key)}]})})
|
334
|
+
container_service.location = Chamber.env.location
|
335
|
+
container_service.master_profile = (
|
336
|
+
AzureAPI::ContainerService::Models::ContainerServiceMasterProfile.new.tap { |master_profile|
|
337
|
+
master_profile.dns_prefix = [Chamber.env.dns_prefix, Chamber.env.master_dns_suffix].join('-')})
|
338
|
+
container_service.orchestrator_profile = (
|
339
|
+
AzureAPI::ContainerService::Models::ContainerServiceOrchestratorProfile.new.tap { |orchestrator_profile|
|
340
|
+
orchestrator_profile.orchestrator_type = Chamber.env.orchestrator_type})
|
341
|
+
container_service.service_principal_profile = (
|
342
|
+
AzureAPI::ContainerService::Models::ContainerServiceServicePrincipalProfile.new.tap { |service_principal_profile|
|
343
|
+
service_principal_profile.client_id = service_principal.app_id
|
344
|
+
service_principal_profile.secret = Chamber.env.password})})}}
|
327
345
|
|
328
346
|
FindVirtualMachines = ->(resource_group) {
|
329
347
|
AzureAPI::Compute::VirtualMachines
|
@@ -360,46 +378,50 @@ RunShellScript = ->(script, *rest) { RunShellScripts.([script], *rest) }
|
|
360
378
|
RestartVirtualMachine = ->(resource_group, virtual_machine) { AzureAPI::Compute::VirtualMachines.restart(resource_group.name, virtual_machine.name) }.curry
|
361
379
|
|
362
380
|
FindPublicIPv4 = ->(resource_group) {
|
363
|
-
|
364
|
-
|
365
|
-
|
381
|
+
WhileSpinning.("Public IPv4 Exists", report: :ip_address) {
|
382
|
+
AzureAPI::Network::PublicIpaddresses
|
383
|
+
.list(resource_group.name)
|
384
|
+
.find { |public_ip_address| public_ip_address.name == Chamber.env.identifier }}}
|
366
385
|
|
367
386
|
CreatePublicIPv4 = ->(resource_group) {
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
387
|
+
WhileSpinning.("Create Public IPv4", report: :ip_address) {
|
388
|
+
AzureAPI::Network::PublicIpaddresses.create_or_update(
|
389
|
+
resource_group.name,
|
390
|
+
Chamber.env.identifier,
|
391
|
+
AzureAPI::Network::Models::PublicIPAddress.new.tap { |public_ip_address|
|
392
|
+
public_ip_address.location = Chamber.env.location
|
393
|
+
public_ip_address.public_ipaddress_version = 'IPv4'
|
394
|
+
public_ip_address.public_ipallocation_method = 'Static'
|
395
|
+
})}}
|
376
396
|
|
377
397
|
KubernetesMasterSecurityGroup = ->(resource_group) {
|
378
398
|
name = [*KubernetesMaster.(resource_group).name.split('-').first(3), 'nsg'].join('-')
|
379
|
-
|
380
|
-
|
381
|
-
|
399
|
+
WhileSpinning.("Network Security Group Exists", report: :name) {
|
400
|
+
AzureAPI::Network::NetworkSecurityGroups
|
401
|
+
.list(resource_group.name)
|
402
|
+
.find { |network_security_group| network_security_group.name == name }}}
|
382
403
|
|
383
404
|
FindSecurityRule = ->(network_security_group) {
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
}
|
405
|
+
WhileSpinning.("Security Rule Exists", report: :name) {
|
406
|
+
network_security_group
|
407
|
+
.security_rules
|
408
|
+
.find { |security_rule| security_rule.name == Chamber.env.identifier }}}
|
388
409
|
|
389
410
|
CreateSecurityRule = ->(network_security_group, resource_group) {
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
411
|
+
WhileSpinning.("Create Security Rule", report: :name) {
|
412
|
+
AzureAPI::Network::SecurityRules.create_or_update(
|
413
|
+
resource_group.name,
|
414
|
+
network_security_group.name,
|
415
|
+
Chamber.env.identifier,
|
416
|
+
AzureAPI::Network::Models::SecurityRule.new.tap { |security_rule|
|
417
|
+
security_rule.access = 'Allow'
|
418
|
+
security_rule.destination_address_prefix = '*'
|
419
|
+
security_rule.destination_port_ranges = [80,443,4443,2222,2793]
|
420
|
+
security_rule.direction = AzureAPI::Network::Models::SecurityRuleDirection::Inbound
|
421
|
+
security_rule.priority = network_security_group.security_rules.map(&:priority).max.next
|
422
|
+
security_rule.protocol = 'Tcp'
|
423
|
+
security_rule.source_address_prefix = '*'
|
424
|
+
security_rule.source_port_range = '*'})}}
|
403
425
|
|
404
426
|
UpdateVirtualMachine = ->(virtual_machine, resource_group) {
|
405
427
|
AzureAPI::Compute::VirtualMachines.create_or_update(
|
@@ -408,31 +430,36 @@ UpdateVirtualMachine = ->(virtual_machine, resource_group) {
|
|
408
430
|
virtual_machine)}
|
409
431
|
|
410
432
|
ApplyTag = ->(key, value, resource_group, virtual_machine) {
|
411
|
-
|
433
|
+
WhileSpinning.("Apply Tag #{key}=#{value} to #{virtual_machine.name}") {
|
434
|
+
UpdateVirtualMachine.(virtual_machine.tap { virtual_machine.tags[key] = value }, resource_group)}}
|
412
435
|
|
413
436
|
EnableSwapAccounting = ->(resource_group, virtual_machine) {
|
414
437
|
return if virtual_machine.tags['cloudstrap.swap_accounting'] == 'enabled'
|
415
|
-
|
438
|
+
WhileSpinning.("Enable Swap Accounting on #{virtual_machine.name}") {
|
439
|
+
RunShellScripts.([ENABLE_SWAP_ACCOUNTING, UPDATE_GRUB], resource_group, virtual_machine)}
|
416
440
|
ApplyTag.('cloudstrap.swap_accounting', 'enabled', resource_group, virtual_machine)}.curry
|
417
441
|
|
418
442
|
RebootOnce = ->(resource_group, virtual_machine) {
|
419
443
|
return if virtual_machine.tags['cloudstrap.reboot'] == 'finished'
|
420
444
|
ApplyTag.('cloudstrap.reboot', 'started', resource_group, virtual_machine)
|
421
|
-
|
445
|
+
WhileSpinning.("Reboot Virtual Machine #{virtual_machine.name}") {
|
446
|
+
RestartVirtualMachine.(resource_group, virtual_machine)}
|
422
447
|
ApplyTag.('cloudstrap.reboot', 'finished', resource_group, virtual_machine)}.curry
|
423
448
|
|
424
449
|
FindNetworkInterface = ->(resource_group) {
|
425
|
-
|
426
|
-
|
427
|
-
|
428
|
-
|
450
|
+
WhileSpinning.("Network Interface Exists", report: :name) {
|
451
|
+
virtual_machine = KubernetesAgents.(resource_group).sort_by(&:name).first
|
452
|
+
AzureAPI::Network::NetworkInterfaces
|
453
|
+
.list(resource_group.name)
|
454
|
+
.find { |network_interface| network_interface.virtual_machine.id.end_with?(virtual_machine.name)}}}
|
429
455
|
|
430
456
|
AssociatePublicIP = ->(resource_group, network_interface, public_ip_address) {
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
network_interface.
|
457
|
+
WhileSpinning.("Associate Public IPv4") {
|
458
|
+
AzureAPI::Network::NetworkInterfaces.create_or_update(
|
459
|
+
resource_group.name,
|
460
|
+
network_interface.name,
|
461
|
+
network_interface.tap {
|
462
|
+
network_interface.ip_configurations[0].public_ipaddress = public_ip_address})}}
|
436
463
|
|
437
464
|
################
|
438
465
|
# Main Program #
|
@@ -455,29 +482,30 @@ WhileSpinning.('Constructing Library') do
|
|
455
482
|
AddInteractiveCalls.(AzureAPI)
|
456
483
|
end
|
457
484
|
|
458
|
-
role_definition = WhileSpinning.('Find Role Definition') { FindRoleDefinition.(Chamber.env.role_definition) }
|
459
|
-
resource_group = WhileSpinning.('Find/Create Resource Group') { FindResourceGroup.(Chamber.env.identifier) || CreateResourceGroup.(Chamber.env.identifier) }
|
460
|
-
application = WhileSpinning.('Find/Create Application') { FindApplication.(Chamber.env.identifier) || CreateApplication.(Chamber.env.identifier) }
|
461
|
-
service_principal = WhileSpinning.('Find/Create Service Principal') { FindServicePrincipal.(application) || CreateServicePrincipal.(application) }
|
462
485
|
|
463
|
-
|
486
|
+
application = FindApplication.(Chamber.env.identifier) || CreateApplication.(Chamber.env.identifier)
|
487
|
+
service_principal = FindServicePrincipal.(application) || CreateServicePrincipal.(application)
|
488
|
+
role_definition = FindRoleDefinition.(Chamber.env.role_definition)
|
489
|
+
resource_group = FindResourceGroup.(Chamber.env.identifier) || CreateResourceGroup.(Chamber.env.identifier)
|
464
490
|
|
465
|
-
|
466
|
-
public_ip_address = WhileSpinning.('Find/Create Public IP Address') { FindPublicIPv4.(resource_group) || CreatePublicIPv4.(resource_group) }
|
467
|
-
container_service = WhileSpinning.('Find/Create Container Service') { FindContainerService.(resource_group) || CreateContainerService.(service_principal, resource_group) }
|
491
|
+
UpdatePassword.(service_principal, Chamber.env.password)
|
468
492
|
|
469
|
-
|
470
|
-
|
493
|
+
role_assignment = FindRoleAssignment.(Chamber.env.uuid) || (
|
494
|
+
WhileSpinning.("Arbitrary Delay of #{ARBITRARY_DELAY} Seconds") { sleep ARBITRARY_DELAY }
|
495
|
+
CreateRoleAssignment.(role_definition, service_principal, resource_group))
|
471
496
|
|
472
|
-
|
473
|
-
|
497
|
+
public_ip_address = FindPublicIPv4.(resource_group) || CreatePublicIPv4.(resource_group)
|
498
|
+
container_service = FindContainerService.(resource_group) || CreateContainerService.(service_principal, resource_group)
|
474
499
|
|
475
|
-
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
500
|
+
network_security_group = KubernetesMasterSecurityGroup.(resource_group)
|
501
|
+
security_rule = FindSecurityRule.(network_security_group) || CreateSecurityRule.(network_security_group, resource_group)
|
502
|
+
network_interface = FindNetworkInterface.(resource_group)
|
503
|
+
association = AssociatePublicIP.(resource_group, network_interface, public_ip_address)
|
504
|
+
|
505
|
+
KubernetesAgents
|
506
|
+
.(resource_group)
|
507
|
+
.each(&EnableSwapAccounting.(resource_group))
|
508
|
+
.each(&RebootOnce.(resource_group))
|
481
509
|
|
482
510
|
def api(*args)
|
483
511
|
AzureAPI.call(*args)
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cloudstrap-azure
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.6.pre
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Chris Olstrom
|
@@ -34,7 +34,7 @@ cert_chain:
|
|
34
34
|
EIKh6yDoB+oCRuiTV0uw/lKE2PtbONhJb7uN1qhZqla/iBpmUjiEu8+skI+ygv9n
|
35
35
|
7Krw8FJrV3+VRCiZTPKHeshAfL9yeIZh
|
36
36
|
-----END CERTIFICATE-----
|
37
|
-
date: 2018-04-
|
37
|
+
date: 2018-04-24 00:00:00.000000000 Z
|
38
38
|
dependencies:
|
39
39
|
- !ruby/object:Gem::Dependency
|
40
40
|
name: azure_graph_rbac
|
metadata.gz.sig
CHANGED
Binary file
|