diff --git a/src/command_modules/azure-cli-vm/azure/cli/command_modules/vm/generated.py b/src/command_modules/azure-cli-vm/azure/cli/command_modules/vm/generated.py index 646ea28cd3a..f54f4989e3d 100644 --- a/src/command_modules/azure-cli-vm/azure/cli/command_modules/vm/generated.py +++ b/src/command_modules/azure-cli-vm/azure/cli/command_modules/vm/generated.py @@ -1,5 +1,6 @@ import argparse import re +import os from azure.mgmt.compute import ComputeManagementClient, ComputeManagementClientConfiguration from azure.mgmt.compute.operations import (AvailabilitySetsOperations, VirtualMachineExtensionImagesOperations, @@ -211,11 +212,25 @@ def __call__(self, parser, namespace, values, option_string=None): else: namespace.os_type = image +class VMSSHFieldAction(argparse.Action): #pylint: disable=too-few-public-methods + def __call__(self, parser, namespace, values, option_string=None): + ssh_value = values + + if os.path.exists(ssh_value): + with open(ssh_value, 'r') as f: + namespace.ssh_key_value = f.read() + else: + namespace.ssh_key_value = ssh_value + extra_parameters = [ { 'name': '--image', 'help': 'The OS image. Supported values: Common OS (e.g. Win2012R2Datacenter), URN (e.g. "publisher:offer:sku:version"), or existing VHD URI.', 'action': VMImageFieldAction + }, + { + 'name': '--ssh-key-value', + 'action': VMSSHFieldAction } ] @@ -248,7 +263,7 @@ def __call__(self, parser, namespace, values, option_string=None): --virtual-network-type existing --virtual-network-name myvnet --subnet-name default --availability-set-type existing --availability-set-id myavailset --public-ip-address-type new --dns-name-for-public-ip myGloballyUniqueVmDnsName - -l "West US" -g myvms --name myvm18o --ssh-key-value "" + -l "West US" -g myvms --name myvm18o --ssh-key-value "" """ build_operation('vm', diff --git a/src/command_modules/azure-cli-vm/azure/cli/command_modules/vm/mgmt/azuredeploy.json b/src/command_modules/azure-cli-vm/azure/cli/command_modules/vm/mgmt/azuredeploy.json index aa2f995904a..98c91eb9c8f 100644 --- a/src/command_modules/azure-cli-vm/azure/cli/command_modules/vm/mgmt/azuredeploy.json +++ b/src/command_modules/azure-cli-vm/azure/cli/command_modules/vm/mgmt/azuredeploy.json @@ -11,8 +11,9 @@ }, "adminPassword": { "type": "securestring", + "defaultValue": "", "metadata": { - "description": "Password for the Virtual Machine." + "description": "Password for the Virtual Machine. Required if SSH (Linux only) is not specified." } }, "adminUsername": { diff --git a/src/command_modules/azure-cli-vm/azure/cli/command_modules/vm/mgmt/lib/models/deployment_vm.py b/src/command_modules/azure-cli-vm/azure/cli/command_modules/vm/mgmt/lib/models/deployment_vm.py index 0324236dc36..c8e9042f227 100644 --- a/src/command_modules/azure-cli-vm/azure/cli/command_modules/vm/mgmt/lib/models/deployment_vm.py +++ b/src/command_modules/azure-cli-vm/azure/cli/command_modules/vm/mgmt/lib/models/deployment_vm.py @@ -38,7 +38,8 @@ class DeploymentVM(Model): used to access the Virtual Machine. :type dns_name_for_public_ip: str :param storage_account_type: Whether to use an existing storage account - or create a new one. + or create a new one. Possible values include: 'new', 'existing'. Default + value: "new" . :type storage_account_type: str :param os_disk_uri: URI for a custom VHD image. :type os_disk_uri: str @@ -48,16 +49,21 @@ class DeploymentVM(Model): :param name: The VM resource name. :type name: str :param virtual_network_type: Whether to use an existing VNet or create a - new one. + new one. Possible values include: 'new', 'existing'. Default value: + "new" . :type virtual_network_type: str - :param admin_password: Password for the Virtual Machine. + :param admin_password: Password for the Virtual Machine. Required if SSH + (Linux only) is not specified. :type admin_password: str :param os_sku: The OS SKU to install. :type os_sku: str :param subnet_name: The subnet name. :type subnet_name: str :param os_type: Common OS choices. Choose 'Custom' to specify an image - with the osPublisher, osOffer, osSKU, and osVersion parameters. + with the osPublisher, osOffer, osSKU, and osVersion parameters. Possible + values include: 'CentOS', 'CoreOS', 'Debian', 'openSUSE', 'RHEL', + 'SLES', 'UbuntuLTS', 'Win2012R2Datacenter', 'Win2012Datacenter', + 'Win2008R2SP1', 'Custom'. Default value: "Win2012R2Datacenter" . :type os_type: str :param admin_username: Username for the Virtual Machine. :type admin_username: str @@ -70,10 +76,12 @@ class DeploymentVM(Model): :param os_offer: The OS Offer to install. :type os_offer: str :param public_ip_address_allocation: Dynamic or Static public IP address - allocation. + allocation. Possible values include: 'Dynamic', 'Static'. Default value: + "Dynamic" . :type public_ip_address_allocation: str :param authentication_type: Authentication method: password-only or add - ssh-keys (Linux-only). + ssh-keys (Linux-only). Possible values include: 'password', 'sshkey'. + Default value: "password" . :type authentication_type: str :param storage_account_name: Name of storage account for the VM OS disk. :type storage_account_name: str @@ -82,7 +90,8 @@ class DeploymentVM(Model): :param size: The VM Size that should be created (e.g. Standard_A2) :type size: str :param public_ip_address_type: Use a public IP Address for the VM Nic. - (new, existing or none). + (new, existing or none). Possible values include: 'none', 'new', + 'existing'. Default value: "none" . :type public_ip_address_type: str :param virtual_network_ip_address_prefix: The IP address prefix. :type virtual_network_ip_address_prefix: str @@ -95,12 +104,14 @@ class DeploymentVM(Model): :param os_publisher: The OS publisher of the OS image. :type os_publisher: str :param availability_set_type: Flag to add the VM to an existing - availability set. + availability set. Possible values include: 'none', 'existing'. Default + value: "none" . :type availability_set_type: str :param public_ip_address_name: Name of public IP address to use. :type public_ip_address_name: str :param dns_name_type: Associate VMs with a public IP address to a DNS - name (new or none). + name (new or none). Possible values include: 'none', 'new'. Default + value: "none" . :type dns_name_type: str :ivar mode: Gets or sets the deployment mode. Default value: "Incremental" . @@ -111,7 +122,6 @@ class DeploymentVM(Model): 'uri': {'required': True, 'constant': True}, '_artifacts_location': {'constant': True}, 'name': {'required': True}, - 'admin_password': {'required': True}, 'admin_username': {'required': True}, 'mode': {'required': True, 'constant': True}, } @@ -161,7 +171,7 @@ class DeploymentVM(Model): mode = "Incremental" - def __init__(self, name, admin_password, admin_username, content_version=None, storage_container_name=None, virtual_network_name=None, subnet_ip_address_prefix=None, private_ip_address_allocation=None, dns_name_for_public_ip=None, storage_account_type=None, os_disk_uri=None, virtual_network_type=None, os_sku=None, subnet_name=None, os_type=None, os_version=None, os_disk_name=None, ssh_key_path=None, os_offer=None, public_ip_address_allocation=None, authentication_type=None, storage_account_name=None, storage_redundancy_type=None, size=None, public_ip_address_type=None, virtual_network_ip_address_prefix=None, availability_set_id=None, ssh_key_value=None, location=None, os_publisher=None, availability_set_type=None, public_ip_address_name=None, dns_name_type=None): + def __init__(self, name, admin_username, content_version=None, storage_container_name=None, virtual_network_name=None, subnet_ip_address_prefix=None, private_ip_address_allocation=None, dns_name_for_public_ip=None, storage_account_type="new", os_disk_uri=None, virtual_network_type="new", admin_password=None, os_sku=None, subnet_name=None, os_type="Win2012R2Datacenter", os_version=None, os_disk_name=None, ssh_key_path=None, os_offer=None, public_ip_address_allocation="Dynamic", authentication_type="password", storage_account_name=None, storage_redundancy_type=None, size=None, public_ip_address_type="none", virtual_network_ip_address_prefix=None, availability_set_id=None, ssh_key_value=None, location=None, os_publisher=None, availability_set_type="none", public_ip_address_name=None, dns_name_type="none"): self.content_version = content_version self.storage_container_name = storage_container_name self.virtual_network_name = virtual_network_name diff --git a/src/command_modules/azure-cli-vm/azure/cli/command_modules/vm/mgmt/lib/operations/vm_operations.py b/src/command_modules/azure-cli-vm/azure/cli/command_modules/vm/mgmt/lib/operations/vm_operations.py index 08f5e15d5cd..991aa1bd36f 100644 --- a/src/command_modules/azure-cli-vm/azure/cli/command_modules/vm/mgmt/lib/operations/vm_operations.py +++ b/src/command_modules/azure-cli-vm/azure/cli/command_modules/vm/mgmt/lib/operations/vm_operations.py @@ -32,7 +32,7 @@ def __init__(self, client, config, serializer, deserializer): self.config = config def create_or_update( - self, resource_group_name, deployment_name, name, admin_password, admin_username, content_version=None, storage_container_name=None, virtual_network_name=None, subnet_ip_address_prefix=None, private_ip_address_allocation=None, dns_name_for_public_ip=None, storage_account_type=None, os_disk_uri=None, virtual_network_type=None, os_sku=None, subnet_name=None, os_type=None, os_version=None, os_disk_name=None, ssh_key_path=None, os_offer=None, public_ip_address_allocation=None, authentication_type=None, storage_account_name=None, storage_redundancy_type=None, size=None, public_ip_address_type=None, virtual_network_ip_address_prefix=None, availability_set_id=None, ssh_key_value=None, location=None, os_publisher=None, availability_set_type=None, public_ip_address_name=None, dns_name_type=None, custom_headers={}, raw=False, **operation_config): + self, resource_group_name, deployment_name, name, admin_username, content_version=None, storage_container_name=None, virtual_network_name=None, subnet_ip_address_prefix=None, private_ip_address_allocation=None, dns_name_for_public_ip=None, storage_account_type="new", os_disk_uri=None, virtual_network_type="new", admin_password=None, os_sku=None, subnet_name=None, os_type="Win2012R2Datacenter", os_version=None, os_disk_name=None, ssh_key_path=None, os_offer=None, public_ip_address_allocation="Dynamic", authentication_type="password", storage_account_name=None, storage_redundancy_type=None, size=None, public_ip_address_type="none", virtual_network_ip_address_prefix=None, availability_set_id=None, ssh_key_value=None, location=None, os_publisher=None, availability_set_type="none", public_ip_address_name=None, dns_name_type="none", custom_headers={}, raw=False, **operation_config): """ Create or update a virtual machine. @@ -43,8 +43,6 @@ def create_or_update( :type deployment_name: str :param name: The VM resource name. :type name: str - :param admin_password: Password for the Virtual Machine. - :type admin_password: str :param admin_username: Username for the Virtual Machine. :type admin_username: str :param content_version: If included it must match the ContentVersion @@ -64,19 +62,26 @@ def create_or_update( Public IP used to access the Virtual Machine. :type dns_name_for_public_ip: str :param storage_account_type: Whether to use an existing storage - account or create a new one. + account or create a new one. Possible values include: 'new', + 'existing' :type storage_account_type: str :param os_disk_uri: URI for a custom VHD image. :type os_disk_uri: str :param virtual_network_type: Whether to use an existing VNet or - create a new one. + create a new one. Possible values include: 'new', 'existing' :type virtual_network_type: str + :param admin_password: Password for the Virtual Machine. Required if + SSH (Linux only) is not specified. + :type admin_password: str :param os_sku: The OS SKU to install. :type os_sku: str :param subnet_name: The subnet name. :type subnet_name: str :param os_type: Common OS choices. Choose 'Custom' to specify an - image with the osPublisher, osOffer, osSKU, and osVersion parameters. + image with the osPublisher, osOffer, osSKU, and osVersion + parameters. Possible values include: 'CentOS', 'CoreOS', 'Debian', + 'openSUSE', 'RHEL', 'SLES', 'UbuntuLTS', 'Win2012R2Datacenter', + 'Win2012Datacenter', 'Win2008R2SP1', 'Custom' :type os_type: str :param os_version: The OS version to install. :type os_version: str @@ -87,10 +92,11 @@ def create_or_update( :param os_offer: The OS Offer to install. :type os_offer: str :param public_ip_address_allocation: Dynamic or Static public IP - address allocation. + address allocation. Possible values include: 'Dynamic', 'Static' :type public_ip_address_allocation: str :param authentication_type: Authentication method: password-only or - add ssh-keys (Linux-only). + add ssh-keys (Linux-only). Possible values include: 'password', + 'sshkey' :type authentication_type: str :param storage_account_name: Name of storage account for the VM OS disk. @@ -100,7 +106,8 @@ def create_or_update( :param size: The VM Size that should be created (e.g. Standard_A2) :type size: str :param public_ip_address_type: Use a public IP Address for the VM - Nic. (new, existing or none). + Nic. (new, existing or none). Possible values include: 'none', + 'new', 'existing' :type public_ip_address_type: str :param virtual_network_ip_address_prefix: The IP address prefix. :type virtual_network_ip_address_prefix: str @@ -113,12 +120,12 @@ def create_or_update( :param os_publisher: The OS publisher of the OS image. :type os_publisher: str :param availability_set_type: Flag to add the VM to an existing - availability set. + availability set. Possible values include: 'none', 'existing' :type availability_set_type: str :param public_ip_address_name: Name of public IP address to use. :type public_ip_address_name: str :param dns_name_type: Associate VMs with a public IP address to a DNS - name (new or none). + name (new or none). Possible values include: 'none', 'new' :type dns_name_type: str :param dict custom_headers: headers that will be added to the request :param bool raw: returns the direct response alongside the diff --git a/src/command_modules/azure-cli-vm/azure/cli/command_modules/vm/mgmt/nested_templates/vm_existing_sshkey.json b/src/command_modules/azure-cli-vm/azure/cli/command_modules/vm/mgmt/nested_templates/vm_existing_sshkey.json index 9c0b86a2acd..4083af1a5ad 100644 --- a/src/command_modules/azure-cli-vm/azure/cli/command_modules/vm/mgmt/nested_templates/vm_existing_sshkey.json +++ b/src/command_modules/azure-cli-vm/azure/cli/command_modules/vm/mgmt/nested_templates/vm_existing_sshkey.json @@ -90,7 +90,6 @@ "osProfile": { "computerName": "[variables('vmName')]", "adminUsername": "[parameters('adminUsername')]", - "adminPassword": "[parameters('adminPassword')]", "linuxConfiguration": { "disablePasswordAuthentication": true, "ssh": { diff --git a/src/command_modules/azure-cli-vm/azure/cli/command_modules/vm/mgmt/nested_templates/vm_none_sshkey.json b/src/command_modules/azure-cli-vm/azure/cli/command_modules/vm/mgmt/nested_templates/vm_none_sshkey.json index 0c891040163..3d6558d5c57 100644 --- a/src/command_modules/azure-cli-vm/azure/cli/command_modules/vm/mgmt/nested_templates/vm_none_sshkey.json +++ b/src/command_modules/azure-cli-vm/azure/cli/command_modules/vm/mgmt/nested_templates/vm_none_sshkey.json @@ -88,7 +88,6 @@ "osProfile": { "computerName": "[variables('vmName')]", "adminUsername": "[parameters('adminUsername')]", - "adminPassword": "[parameters('adminPassword')]", "linuxConfiguration": { "disablePasswordAuthentication": true, "ssh": { diff --git a/src/command_modules/azure-cli-vm/azure/cli/command_modules/vm/mgmt/swagger_create_vm.json b/src/command_modules/azure-cli-vm/azure/cli/command_modules/vm/mgmt/swagger_create_vm.json index 34f45ab7629..47cb93e372f 100644 --- a/src/command_modules/azure-cli-vm/azure/cli/command_modules/vm/mgmt/swagger_create_vm.json +++ b/src/command_modules/azure-cli-vm/azure/cli/command_modules/vm/mgmt/swagger_create_vm.json @@ -327,7 +327,6 @@ } }, "required": [ - "adminPassword", "adminUsername", "virtualMachineName" ] @@ -382,6 +381,11 @@ "value": { "type": "string", "description": "Whether to use an existing storage account or create a new one.", + "enum": [ + "new", + "existing" + ], + "default": "new", "x-ms-client-name": "storageAccountType" } } @@ -427,6 +431,11 @@ "value": { "type": "string", "description": "Whether to use an existing VNet or create a new one.", + "enum": [ + "new", + "existing" + ], + "default": "new", "x-ms-client-name": "virtualNetworkType" } } @@ -435,14 +444,10 @@ "properties": { "value": { "type": "string", - "description": "Password for the Virtual Machine.", + "description": "Password for the Virtual Machine. Required if SSH (Linux only) is not specified.", "x-ms-client-name": "adminPassword" } - }, - "required": [ - "value" - ] - + } }, "DeploymentParameter_osSKU": { "properties": { @@ -467,6 +472,20 @@ "value": { "type": "string", "description": "Common OS choices. Choose 'Custom' to specify an image with the osPublisher, osOffer, osSKU, and osVersion parameters.", + "enum": [ + "CentOS", + "CoreOS", + "Debian", + "openSUSE", + "RHEL", + "SLES", + "UbuntuLTS", + "Win2012R2Datacenter", + "Win2012Datacenter", + "Win2008R2SP1", + "Custom" + ], + "default": "Win2012R2Datacenter", "x-ms-client-name": "osType" } } @@ -525,6 +544,11 @@ "value": { "type": "string", "description": "Dynamic or Static public IP address allocation.", + "enum": [ + "Dynamic", + "Static" + ], + "default": "Dynamic", "x-ms-client-name": "publicIpAddressAllocation" } } @@ -534,6 +558,11 @@ "value": { "type": "string", "description": "Authentication method: password-only or add ssh-keys (Linux-only).", + "enum": [ + "password", + "sshkey" + ], + "default": "password", "x-ms-client-name": "authenticationType" } } @@ -570,6 +599,12 @@ "value": { "type": "string", "description": "Use a public IP Address for the VM Nic. (new, existing or none).", + "enum": [ + "none", + "new", + "existing" + ], + "default": "none", "x-ms-client-name": "publicIpAddressType" } } @@ -624,6 +659,11 @@ "value": { "type": "string", "description": "Flag to add the VM to an existing availability set.", + "enum": [ + "none", + "existing" + ], + "default": "none", "x-ms-client-name": "availabilitySetType" } } @@ -642,6 +682,11 @@ "value": { "type": "string", "description": "Associate VMs with a public IP address to a DNS name (new or none).", + "enum": [ + "none", + "new" + ], + "default": "none", "x-ms-client-name": "dnsNameType" } }