Class: Kitchen::Driver::Azurerm
- Inherits:
-
Base
- Object
- Base
- Kitchen::Driver::Azurerm
- Defined in:
- lib/kitchen/driver/azurerm.rb
Overview
Azurerm Create a new resource group object and set the location and tags attributes then return it.
Instance Attribute Summary collapse
-
#network_management_client ⇒ Object
Returns the value of attribute network_management_client.
-
#resource_management_client ⇒ Object
Returns the value of attribute resource_management_client.
Instance Method Summary collapse
- #azure_resource_group_name ⇒ Object
- #create(state) ⇒ Object
- #custom_data_script_windows ⇒ Object
- #custom_linux_configuration(public_key) ⇒ Object
- #data_disks_for_vm_json ⇒ Object
- #deployment(parameters) ⇒ Object
- #destroy(state) ⇒ Object
- #empty_deployment ⇒ Object
- #enable_winrm_powershell_script ⇒ Object
-
#existing_state_value?(state, property) ⇒ Boolean
Return a True of False if the state is already stored for a particular property.
- #follow_deployment_until_end_state(resource_group, deployment_name) ⇒ Object
- #format_data_disks_powershell_script ⇒ Object
- #list_outstanding_deployment_operations(resource_group, deployment_name) ⇒ Object
- #parameters_in_values_format(parameters_in) ⇒ Object
- #plan_json ⇒ Object
- #post_deployment(post_deployment_template_filename, post_deployment_parameters) ⇒ Object
- #pre_deployment(pre_deployment_template_filename, pre_deployment_parameters) ⇒ Object
- #prepared_custom_data ⇒ Object
- #public_key_for_deployment(private_key_filename) ⇒ Object
- #resource_manager_endpoint_url(azure_environment) ⇒ Object
- #show_failed_operations(resource_group, deployment_name) ⇒ Object
- #template_for_transport_name ⇒ Object
-
#validate_state(state = {}) ⇒ Hash
Leverage existing state values or bring state into existence from a configuration file.
- #virtual_machine_deployment_template ⇒ Object
- #virtual_machine_deployment_template_file(template_file, data = {}) ⇒ Object
- #vm_tag_string(vm_tags_in) ⇒ Object
- #windows_unattend_content ⇒ Object
Instance Attribute Details
#network_management_client ⇒ Object
Returns the value of attribute network_management_client.
27 28 29 |
# File 'lib/kitchen/driver/azurerm.rb', line 27 def network_management_client @network_management_client end |
#resource_management_client ⇒ Object
Returns the value of attribute resource_management_client.
26 27 28 |
# File 'lib/kitchen/driver/azurerm.rb', line 26 def resource_management_client @resource_management_client end |
Instance Method Details
#azure_resource_group_name ⇒ Object
387 388 389 390 391 392 |
# File 'lib/kitchen/driver/azurerm.rb', line 387 def azure_resource_group_name formatted_time = Time.now.utc.strftime "%Y%m%dT%H%M%S" return "#{config[:azure_resource_group_prefix]}#{config[:azure_resource_group_name]}-#{formatted_time}#{config[:azure_resource_group_suffix]}" unless config[:explicit_resource_group_name] config[:explicit_resource_group_name] end |
#create(state) ⇒ Object
221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 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 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 |
# File 'lib/kitchen/driver/azurerm.rb', line 221 def create(state) state = validate_state(state) deployment_parameters = { location: config[:location], vmSize: config[:machine_size], storageAccountType: config[:storage_account_type], bootDiagnosticsEnabled: config[:boot_diagnostics_enabled], newStorageAccountName: "storage#{state[:uuid]}", adminUsername: config[:username], dnsNameForPublicIP: "kitchen-#{state[:uuid]}", vmName: state[:vm_name], systemAssignedIdentity: config[:system_assigned_identity], userAssignedIdentities: config[:user_assigned_identities].map { |identity| [identity, {}] }.to_h, secretUrl: config[:secret_url], vaultName: config[:vault_name], vaultResourceGroup: config[:vault_resource_group], } if instance.transport[:ssh_key].nil? deployment_parameters[:adminPassword] = config[:password] end deployment_parameters[:publicIPSKU] = config[:public_ip_sku] if config[:public_ip_sku] == "Standard" deployment_parameters[:publicIPAddressType] = "Static" end if config[:subscription_id].to_s == "" raise "A subscription_id config value was not detected and kitchen-azurerm cannot continue. Please check your kitchen.yml configuration. Exiting." end if config[:nic_name].to_s == "" vmnic = "nic-#{state[:vm_name]}" else vmnic = config[:nic_name] end deployment_parameters["nicName"] = vmnic.to_s if config[:custom_data].to_s != "" deployment_parameters["customData"] = prepared_custom_data end # When deploying in a shared storage account, we needs to add # a unique suffix to support multiple kitchen instances if config[:existing_storage_account_blob_url].to_s != "" deployment_parameters["osDiskNameSuffix"] = "-#{state[:azure_resource_group_name]}" end if config[:existing_storage_account_blob_url].to_s != "" deployment_parameters["existingStorageAccountBlobURL"] = config[:existing_storage_account_blob_url] end if config[:existing_storage_account_container].to_s != "" deployment_parameters["existingStorageAccountBlobContainer"] = config[:existing_storage_account_container] end if config[:os_disk_size_gb].to_s != "" deployment_parameters["osDiskSizeGb"] = config[:os_disk_size_gb] end # The three deployment modes # a) Private Image: Managed VM Image (by id) # b) Private Image: Using a VHD URL (note: we must use existing_storage_account_blob_url due to azure limitations) # c) Public Image: Using a marketplace image (urn) if config[:image_id].to_s != "" deployment_parameters["imageId"] = config[:image_id] elsif config[:image_url].to_s != "" deployment_parameters["imageUrl"] = config[:image_url] deployment_parameters["osType"] = config[:os_type] else image_publisher, image_offer, image_sku, image_version = config[:image_urn].split(":", 4) deployment_parameters["imagePublisher"] = image_publisher deployment_parameters["imageOffer"] = image_offer deployment_parameters["imageSku"] = image_sku deployment_parameters["imageVersion"] = image_version end = Kitchen::Driver::AzureCredentials.new(subscription_id: config[:subscription_id], environment: config[:azure_environment]). debug "Azure environment: #{config[:azure_environment]}" @resource_management_client = ::Azure::Resources::Profiles::Latest::Mgmt::Client.new() # Create Resource Group begin info "Creating Resource Group: #{state[:azure_resource_group_name]}" create_resource_group(state[:azure_resource_group_name], get_resource_group) rescue ::MsRestAzure::AzureOperationError => operation_error error operation_error.body raise operation_error end # Execute deployment steps begin if File.file?(config[:pre_deployment_template]) pre_deployment_name = "pre-deploy-#{state[:uuid]}" info "Creating deployment: #{pre_deployment_name}" create_deployment_async(state[:azure_resource_group_name], pre_deployment_name, pre_deployment(config[:pre_deployment_template], config[:pre_deployment_parameters])).value! follow_deployment_until_end_state(state[:azure_resource_group_name], pre_deployment_name) end deployment_name = "deploy-#{state[:uuid]}" info "Creating deployment: #{deployment_name}" create_deployment_async(state[:azure_resource_group_name], deployment_name, deployment(deployment_parameters)).value! follow_deployment_until_end_state(state[:azure_resource_group_name], deployment_name) state[:username] = deployment_parameters[:adminUsername] unless existing_state_value?(state, :username) state[:password] = deployment_parameters[:adminPassword] unless existing_state_value?(state, :password) && instance.transport[:ssh_key].nil? if File.file?(config[:post_deployment_template]) post_deployment_name = "post-deploy-#{state[:uuid]}" info "Creating deployment: #{post_deployment_name}" create_deployment_async(state[:azure_resource_group_name], post_deployment_name, post_deployment(config[:post_deployment_template], config[:post_deployment_parameters])).value! follow_deployment_until_end_state(state[:azure_resource_group_name], post_deployment_name) end rescue ::MsRestAzure::AzureOperationError => operation_error rest_error = operation_error.body["error"] deployment_active = rest_error["code"] == "DeploymentActive" if deployment_active info "Deployment for resource group #{state[:azure_resource_group_name]} is ongoing." info "If you need to change the deployment template you'll need to rerun `kitchen create` for this instance." else info rest_error raise operation_error end end @network_management_client = ::Azure::Network::Profiles::Latest::Mgmt::Client.new() if config[:vnet_id] == "" || config[:public_ip] # Retrieve the public IP from the resource group: result = get_public_ip(state[:azure_resource_group_name], "publicip") info "IP Address is: #{result.ip_address} [#{result.dns_settings.fqdn}]" state[:hostname] = result.ip_address if config[:use_fqdn_hostname] info "Using FQDN to communicate instead of IP" state[:hostname] = result.dns_settings.fqdn end else # Retrieve the internal IP from the resource group: result = get_network_interface(state[:azure_resource_group_name], vmnic.to_s) info "IP Address is: #{result.ip_configurations[0].private_ipaddress}" state[:hostname] = result.ip_configurations[0].private_ipaddress end end |
#custom_data_script_windows ⇒ Object
694 695 696 697 698 699 700 |
# File 'lib/kitchen/driver/azurerm.rb', line 694 def custom_data_script_windows <<-EOH #{enable_winrm_powershell_script} #{format_data_disks_powershell_script} logoff EOH end |
#custom_linux_configuration(public_key) ⇒ Object
702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 |
# File 'lib/kitchen/driver/azurerm.rb', line 702 def custom_linux_configuration(public_key) <<-EOH { "disablePasswordAuthentication": "true", "ssh": { "publicKeys": [ { "path": "[concat('/home/',parameters('adminUsername'),'/.ssh/authorized_keys')]", "keyData": "#{public_key}" } ] } } EOH end |
#data_disks_for_vm_json ⇒ Object
394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 |
# File 'lib/kitchen/driver/azurerm.rb', line 394 def data_disks_for_vm_json return nil if config[:data_disks].nil? disks = [] if config[:use_managed_disks] config[:data_disks].each do |data_disk| disks << { name: "datadisk#{data_disk[:lun]}", lun: data_disk[:lun], diskSizeGB: data_disk[:disk_size_gb], createOption: "Empty" } end debug "Additional disks being added to configuration: #{disks.inspect}" else warn 'Data disks are only supported when used with the "use_managed_disks" option. No additional disks were added to the configuration.' end disks.to_json end |
#deployment(parameters) ⇒ Object
471 472 473 474 475 476 477 478 479 480 |
# File 'lib/kitchen/driver/azurerm.rb', line 471 def deployment(parameters) template = template_for_transport_name deployment = ::Azure::Resources::Profiles::Latest::Mgmt::Models::Deployment.new deployment.properties = ::Azure::Resources::Profiles::Latest::Mgmt::Models::DeploymentProperties.new deployment.properties.mode = ::Azure::Resources::Profiles::Latest::Mgmt::Models::DeploymentMode::Incremental deployment.properties.template = JSON.parse(template) deployment.properties.parameters = parameters_in_values_format(parameters) debug(JSON.pretty_generate(deployment.properties.template)) deployment end |
#destroy(state) ⇒ Object
560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 |
# File 'lib/kitchen/driver/azurerm.rb', line 560 def destroy(state) # TODO: We have some not so fun state issues we need to clean up state[:azure_environment] = config[:azure_environment] unless state[:azure_environment] state[:subscription_id] = config[:subscription_id] unless state[:subscription_id] # Setup our authentication components for the SDK = Kitchen::Driver::AzureCredentials.new(subscription_id: state[:subscription_id], environment: state[:azure_environment]). @resource_management_client = ::Azure::Resources::Profiles::Latest::Mgmt::Client.new() # If we don't have any instances, let's check to see if the user wants to delete a resource group and if so let's delete! if state[:server_id].nil? && state[:azure_resource_group_name].nil? && !config[:explicit_resource_group_name].nil? && config[:destroy_explicit_resource_group] if resource_group_exists?(config[:explicit_resource_group_name]) info "This instance doesn't exist but you asked to delete the resource group." begin info "Destroying Resource Group: #{config[:explicit_resource_group_name]}" delete_resource_group_async(config[:explicit_resource_group_name]) info "Destroy operation accepted and will continue in the background." return rescue ::MsRestAzure::AzureOperationError => operation_error error operation_error.body raise operation_error end end end # Our working environment info "Azure environment: #{state[:azure_environment]}" # Skip if we don't have any instances return if state[:server_id].nil? # Destroy resource group contents if config[:destroy_resource_group_contents] == true info "Destroying individual resources within the Resource Group." empty_deployment_name = "empty-deploy-#{state[:uuid]}" begin info "Creating deployment: #{empty_deployment_name}" create_deployment_async(state[:azure_resource_group_name], empty_deployment_name, empty_deployment).value! follow_deployment_until_end_state(state[:azure_resource_group_name], empty_deployment_name) # NOTE: We are using the internal wrapper function create_resource_group() which wraps the API # method of create_or_update() begin # Maintain tags on the resource group create_resource_group(state[:azure_resource_group_name], get_resource_group) unless config[:destroy_explicit_resource_group_tags] == true warn 'The "destroy_explicit_resource_group_tags" setting value is set to "false". The tags on the resource group will NOT be removed.' unless config[:destroy_explicit_resource_group_tags] == true # Corner case where we want to use kitchen to remove the tags resource_group = get_resource_group resource_group. = {} create_resource_group(state[:azure_resource_group_name], resource_group) unless config[:destroy_explicit_resource_group_tags] == false warn 'The "destroy_explicit_resource_group_tags" setting value is set to "true". The tags on the resource group will be removed.' unless config[:destroy_explicit_resource_group_tags] == false rescue ::MsRestAzure::AzureOperationError => operation_error error operation_error.body raise operation_error end rescue ::MsRestAzure::AzureOperationError => operation_error error operation_error.body raise operation_error end end # Do not remove the explicitly named resource group if config[:destroy_explicit_resource_group] == false && !config[:explicit_resource_group_name].nil? warn 'The "destroy_explicit_resource_group" setting value is set to "false". The resource group will not be deleted.' warn 'Remember to manually destroy resources, or set "destroy_resource_group_contents: true" to save costs!' unless config[:destroy_resource_group_contents] == true return state end # Destroy the world begin info "Destroying Resource Group: #{state[:azure_resource_group_name]}" delete_resource_group_async(state[:azure_resource_group_name]) info "Destroy operation accepted and will continue in the background." # Remove resource group name from driver state state.delete(:azure_resource_group_name) rescue ::MsRestAzure::AzureOperationError => operation_error error operation_error.body raise operation_error end # Clear state of components state.delete(:server_id) state.delete(:hostname) state.delete(:username) state.delete(:password) end |
#empty_deployment ⇒ Object
493 494 495 496 497 498 499 500 501 |
# File 'lib/kitchen/driver/azurerm.rb', line 493 def empty_deployment template = virtual_machine_deployment_template_file("empty.erb", nil) empty_deployment = ::Azure::Resources::Profiles::Latest::Mgmt::Models::Deployment.new empty_deployment.properties = ::Azure::Resources::Profiles::Latest::Mgmt::Models::DeploymentProperties.new empty_deployment.properties.mode = ::Azure::Resources::Profiles::Latest::Mgmt::Models::DeploymentMode::Complete empty_deployment.properties.template = JSON.parse(template) debug(JSON.pretty_generate(empty_deployment.properties.template)) empty_deployment end |
#enable_winrm_powershell_script ⇒ Object
649 650 651 652 653 654 655 656 657 658 659 660 661 |
# File 'lib/kitchen/driver/azurerm.rb', line 649 def enable_winrm_powershell_script config[:winrm_powershell_script] || <<-PS1 $cert = New-SelfSignedCertificate -DnsName $env:COMPUTERNAME -CertStoreLocation Cert:\\LocalMachine\\My $config = '@{CertificateThumbprint="' + $cert.Thumbprint + '"}' winrm create winrm/config/listener?Address=*+Transport=HTTPS $config winrm create winrm/config/Listener?Address=*+Transport=HTTP winrm set winrm/config/service/auth '@{Basic="true";Kerberos="false";Negotiate="true";Certificate="false";CredSSP="true"}' New-NetFirewallRule -DisplayName "Windows Remote Management (HTTPS-In)" -Name "Windows Remote Management (HTTPS-In)" -Profile Any -LocalPort 5986 -Protocol TCP winrm set winrm/config/service '@{AllowUnencrypted="true"}' New-NetFirewallRule -DisplayName "Windows Remote Management (HTTP-In)" -Name "Windows Remote Management (HTTP-In)" -Profile Any -LocalPort 5985 -Protocol TCP PS1 end |
#existing_state_value?(state, property) ⇒ Boolean
Return a True of False if the state is already stored for a particular property.
367 368 369 |
# File 'lib/kitchen/driver/azurerm.rb', line 367 def existing_state_value?(state, property) state.key?(property) && !state[property].nil? end |
#follow_deployment_until_end_state(resource_group, deployment_name) ⇒ Object
523 524 525 526 527 528 529 530 531 532 533 534 |
# File 'lib/kitchen/driver/azurerm.rb', line 523 def follow_deployment_until_end_state(resource_group, deployment_name) end_provisioning_states = "Canceled,Failed,Deleted,Succeeded" end_provisioning_state_reached = false until end_provisioning_state_reached list_outstanding_deployment_operations(resource_group, deployment_name) sleep config[:deployment_sleep] deployment_provisioning_state = get_deployment_state(resource_group, deployment_name) end_provisioning_state_reached = end_provisioning_states.split(",").include?(deployment_provisioning_state) end info "Resource Template deployment reached end state of '#{deployment_provisioning_state}'." show_failed_operations(resource_group, deployment_name) if deployment_provisioning_state == "Failed" end |
#format_data_disks_powershell_script ⇒ Object
663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 |
# File 'lib/kitchen/driver/azurerm.rb', line 663 def format_data_disks_powershell_script return unless config[:format_data_disks] info "Data disks will be initialized and formatted NTFS automatically." unless config[:data_disks].nil? config[:format_data_disks_powershell_script] || <<-PS1 Write-Host "Initializing and formatting raw disks" $disks = Get-Disk | where partitionstyle -eq 'raw' $letters = New-Object System.Collections.ArrayList $letters.AddRange( ('F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z') ) Function AvailableVolumes() { $currentDrives = get-volume ForEach ($v in $currentDrives) { if ($letters -contains $v.DriveLetter.ToString()) { Write-Host "Drive letter $($v.DriveLetter) is taken, moving to next letter" $letters.Remove($v.DriveLetter.ToString()) } } } ForEach ($d in $disks) { AvailableVolumes $driveLetter = $letters[0] Write-Host "Creating volume $($driveLetter)" $d | Initialize-Disk -PartitionStyle GPT -PassThru | New-Partition -DriveLetter $driveLetter -UseMaximumSize # Prevent error ' Cannot perform the requested operation while the drive is read only' Start-Sleep 1 Format-Volume -FileSystem NTFS -NewFileSystemLabel "datadisk" -DriveLetter $driveLetter -Confirm:$false } PS1 end |
#list_outstanding_deployment_operations(resource_group, deployment_name) ⇒ Object
544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 |
# File 'lib/kitchen/driver/azurerm.rb', line 544 def list_outstanding_deployment_operations(resource_group, deployment_name) end_operation_states = "Failed,Succeeded" deployment_operations = list_deployment_operations(resource_group, deployment_name) deployment_operations.each do |val| resource_provisioning_state = val.properties.provisioning_state unless val.properties.target_resource.nil? resource_name = val.properties.target_resource.resource_name resource_type = val.properties.target_resource.resource_type end end_operation_state_reached = end_operation_states.split(",").include?(resource_provisioning_state) unless end_operation_state_reached info "Resource #{resource_type} '#{resource_name}' provisioning status is #{resource_provisioning_state}" end end end |
#parameters_in_values_format(parameters_in) ⇒ Object
516 517 518 519 520 521 |
# File 'lib/kitchen/driver/azurerm.rb', line 516 def parameters_in_values_format(parameters_in) parameters = parameters_in.map do |key, value| { key.to_sym => { "value" => value } } end parameters.reduce(:merge!) end |
#plan_json ⇒ Object
746 747 748 749 750 751 752 753 754 755 756 |
# File 'lib/kitchen/driver/azurerm.rb', line 746 def plan_json return nil if config[:plan].empty? plan = {} plan["name"] = config[:plan][:name] if config[:plan][:name] plan["product"] = config[:plan][:product] if config[:plan][:product] plan["promotionCode"] = config[:plan][:promotion_code] if config[:plan][:promotion_code] plan["publisher"] = config[:plan][:publisher] if config[:plan][:publisher] plan.to_json end |
#post_deployment(post_deployment_template_filename, post_deployment_parameters) ⇒ Object
482 483 484 485 486 487 488 489 490 491 |
# File 'lib/kitchen/driver/azurerm.rb', line 482 def post_deployment(post_deployment_template_filename, post_deployment_parameters) post_deployment_template = ::File.read(post_deployment_template_filename) post_deployment = ::Azure::Resources::Profiles::Latest::Mgmt::Models::Deployment.new post_deployment.properties = ::Azure::Resources::Profiles::Latest::Mgmt::Models::DeploymentProperties.new post_deployment.properties.mode = ::Azure::Resources::Profiles::Latest::Mgmt::Models::DeploymentMode::Incremental post_deployment.properties.template = JSON.parse(post_deployment_template) post_deployment.properties.parameters = parameters_in_values_format(post_deployment_parameters) debug(post_deployment.properties.template) post_deployment end |
#pre_deployment(pre_deployment_template_filename, pre_deployment_parameters) ⇒ Object
460 461 462 463 464 465 466 467 468 469 |
# File 'lib/kitchen/driver/azurerm.rb', line 460 def pre_deployment(pre_deployment_template_filename, pre_deployment_parameters) pre_deployment_template = ::File.read(pre_deployment_template_filename) pre_deployment = ::Azure::Resources::Profiles::Latest::Mgmt::Models::Deployment.new pre_deployment.properties = ::Azure::Resources::Profiles::Latest::Mgmt::Models::DeploymentProperties.new pre_deployment.properties.mode = ::Azure::Resources::Profiles::Latest::Mgmt::Models::DeploymentMode::Incremental pre_deployment.properties.template = JSON.parse(pre_deployment_template) pre_deployment.properties.parameters = parameters_in_values_format(pre_deployment_parameters) debug(pre_deployment.properties.template) pre_deployment end |
#prepared_custom_data ⇒ Object
777 778 779 780 781 782 783 784 785 786 |
# File 'lib/kitchen/driver/azurerm.rb', line 777 def prepared_custom_data # If user_data is a file reference, lets read it as such return nil if config[:custom_data].nil? @custom_data ||= if File.file?(config[:custom_data]) Base64.strict_encode64(File.read(config[:custom_data])) else Base64.strict_encode64(config[:custom_data]) end end |
#public_key_for_deployment(private_key_filename) ⇒ Object
433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 |
# File 'lib/kitchen/driver/azurerm.rb', line 433 def public_key_for_deployment(private_key_filename) if File.file?(private_key_filename) == false k = SSHKey.generate ::FileUtils.mkdir_p(File.dirname(private_key_filename)) private_key_file = File.new(private_key_filename, "w") private_key_file.syswrite(k.private_key) private_key_file.chmod(0600) private_key_file.close public_key_file = File.new("#{private_key_filename}.pub", "w") public_key_file.syswrite(k.ssh_public_key) public_key_file.chmod(0600) public_key_file.close output = k.ssh_public_key else output = if instance.transport[:ssh_public_key].nil? File.read("#{private_key_filename}.pub") else File.read(instance.transport[:ssh_public_key]) end end output.strip end |
#resource_manager_endpoint_url(azure_environment) ⇒ Object
764 765 766 767 768 769 770 771 772 773 774 775 |
# File 'lib/kitchen/driver/azurerm.rb', line 764 def resource_manager_endpoint_url(azure_environment) case azure_environment.downcase when "azureusgovernment" MsRestAzure::AzureEnvironments::AzureUSGovernment.resource_manager_endpoint_url when "azurechina" MsRestAzure::AzureEnvironments::AzureChinaCloud.resource_manager_endpoint_url when "azuregermancloud" MsRestAzure::AzureEnvironments::AzureGermanCloud.resource_manager_endpoint_url when "azure" MsRestAzure::AzureEnvironments::AzureCloud.resource_manager_endpoint_url end end |
#show_failed_operations(resource_group, deployment_name) ⇒ Object
536 537 538 539 540 541 542 |
# File 'lib/kitchen/driver/azurerm.rb', line 536 def show_failed_operations(resource_group, deployment_name) failed_operations = list_deployment_operations(resource_group, deployment_name) failed_operations.each do |val| resource_code = val.properties.status_code raise val.properties..inspect.to_s if resource_code != "OK" end end |
#template_for_transport_name ⇒ Object
410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 |
# File 'lib/kitchen/driver/azurerm.rb', line 410 def template_for_transport_name template = JSON.parse(virtual_machine_deployment_template) if instance.transport.name.casecmp("winrm") == 0 if instance.platform.name.index("nano").nil? info "Adding WinRM configuration to provisioning profile." encoded_command = Base64.strict_encode64(custom_data_script_windows) template["resources"].select { |h| h["type"] == "Microsoft.Compute/virtualMachines" }.each do |resource| resource["properties"]["osProfile"]["customData"] = encoded_command resource["properties"]["osProfile"]["windowsConfiguration"] = windows_unattend_content end end end unless instance.transport[:ssh_key].nil? info "Adding public key from #{File.(instance.transport[:ssh_key])}.pub to the deployment." public_key = public_key_for_deployment(File.(instance.transport[:ssh_key])) template["resources"].select { |h| h["type"] == "Microsoft.Compute/virtualMachines" }.each do |resource| resource["properties"]["osProfile"]["linuxConfiguration"] = JSON.parse(custom_linux_configuration(public_key)) end end template.to_json end |
#validate_state(state = {}) ⇒ Hash
Leverage existing state values or bring state into existence from a configuration file.
375 376 377 378 379 380 381 382 383 384 385 |
# File 'lib/kitchen/driver/azurerm.rb', line 375 def validate_state(state = {}) state[:uuid] = SecureRandom.hex(8) unless existing_state_value?(state, :uuid) state[:vm_name] = config[:vm_name] || "tk-#{state[:uuid][0..11]}" unless existing_state_value?(state, :vm_name) state[:server_id] = "vm#{state[:uuid]}" unless existing_state_value?(state, :server_id) state[:azure_resource_group_name] = azure_resource_group_name unless existing_state_value?(state, :azure_resource_group_name) %i{subscription_id azure_environment use_managed_disks}.each do |config_element| state[config_element] = config[config_element] unless existing_state_value?(state, config_element) end state.delete(:password) unless instance.transport[:ssh_key].nil? state end |
#virtual_machine_deployment_template ⇒ Object
737 738 739 740 741 742 743 744 |
# File 'lib/kitchen/driver/azurerm.rb', line 737 def virtual_machine_deployment_template if config[:vnet_id] == "" virtual_machine_deployment_template_file("public.erb", vm_tags: vm_tag_string(config[:vm_tags]), use_managed_disks: config[:use_managed_disks], image_url: config[:image_url], storage_account_type: config[:storage_account_type], existing_storage_account_blob_url: config[:existing_storage_account_blob_url], image_id: config[:image_id], existing_storage_account_container: config[:existing_storage_account_container], custom_data: config[:custom_data], os_disk_size_gb: config[:os_disk_size_gb], data_disks_for_vm_json: data_disks_for_vm_json, use_ephemeral_osdisk: config[:use_ephemeral_osdisk], ssh_key: instance.transport[:ssh_key], plan_json: plan_json) else info "Using custom vnet: #{config[:vnet_id]}" virtual_machine_deployment_template_file("internal.erb", vnet_id: config[:vnet_id], subnet_id: config[:subnet_id], public_ip: config[:public_ip], vm_tags: vm_tag_string(config[:vm_tags]), use_managed_disks: config[:use_managed_disks], image_url: config[:image_url], storage_account_type: config[:storage_account_type], existing_storage_account_blob_url: config[:existing_storage_account_blob_url], image_id: config[:image_id], existing_storage_account_container: config[:existing_storage_account_container], custom_data: config[:custom_data], os_disk_size_gb: config[:os_disk_size_gb], data_disks_for_vm_json: data_disks_for_vm_json, use_ephemeral_osdisk: config[:use_ephemeral_osdisk], ssh_key: instance.transport[:ssh_key], public_ip_sku: config[:public_ip_sku], plan_json: plan_json) end end |
#virtual_machine_deployment_template_file(template_file, data = {}) ⇒ Object
758 759 760 761 762 |
# File 'lib/kitchen/driver/azurerm.rb', line 758 def virtual_machine_deployment_template_file(template_file, data = {}) template = File.read(File.(File.join(__dir__, "../../../templates", template_file))) render_binding = OpenStruct.new(data) ERB.new(template, nil, "-").result(render_binding.instance_eval { binding }) end |
#vm_tag_string(vm_tags_in) ⇒ Object
503 504 505 506 507 508 509 510 511 512 513 514 |
# File 'lib/kitchen/driver/azurerm.rb', line 503 def vm_tag_string() tag_string = "" unless .empty? tag_array = .map do |key, value| "\"#{key}\": \"#{value}\",\n" end # Strip punctuation from last item tag_array[-1] = tag_array[-1][0..-3] tag_string = tag_array.join end tag_string end |
#windows_unattend_content ⇒ Object
718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 |
# File 'lib/kitchen/driver/azurerm.rb', line 718 def windows_unattend_content { additionalUnattendContent: [ { passName: "oobeSystem", componentName: "Microsoft-Windows-Shell-Setup", settingName: "FirstLogonCommands", content: '<FirstLogonCommands><SynchronousCommand><CommandLine>cmd /c "copy C:\\AzureData\\CustomData.bin C:\\Config.ps1"</CommandLine><Description>copy</Description><Order>1</Order></SynchronousCommand><SynchronousCommand><CommandLine>%windir%\\System32\\WindowsPowerShell\\v1.0\\powershell.exe -NoProfile -ExecutionPolicy Bypass -file C:\\Config.ps1</CommandLine><Description>script</Description><Order>2</Order></SynchronousCommand></FirstLogonCommands>', }, { passName: "oobeSystem", componentName: "Microsoft-Windows-Shell-Setup", settingName: "AutoLogon", content: "[concat('<AutoLogon><Password><Value>', parameters('adminPassword'), '</Value></Password><Enabled>true</Enabled><LogonCount>1</LogonCount><Username>', parameters('adminUserName'), '</Username></AutoLogon>')]", }, ], } end |