'Create a new node instance. This instance will be started
automatically.
This driver supports the ``ssh_key`` feature flag for ``created_node``
so you can upload a public key into the new instance::
>>> from libcloud.compute.drivers.azure_arm import AzureNodeDriver
>>> driver = AzureNodeDriver(...)
>>> auth = NodeAuthSSHKey(\'pubkey data here\')
>>> node = driver.create_node("test_node", auth=auth)
This driver also supports the ``password`` feature flag for
``create_node``
so you can set a password::
>>> driver = AzureNodeDriver(...)
>>> auth = NodeAuthPassword(\'mysecretpassword\')
>>> node = driver.create_node("test_node", auth=auth, ...)
If you don\'t provide the ``auth`` argument libcloud will assign
a password::
>>> driver = AzureNodeDriver(...)
>>> node = driver.create_node("test_node", ...)
>>> password = node.extra["properties"]                            ["osProfile"]["adminPassword"]
:param name:   String with a name for this new node (required)
:type name:   ``str``
:param size:   The size of resources allocated to this node.
(required)
:type size:   :class:`.NodeSize`
:param image:  OS Image to boot on node. (required)
:type image:  :class:`.AzureImage`
:param location: Which data center to create a node in.
(if None, use default location specified as \'region\' in __init__)
:type location: :class:`.NodeLocation`
:param auth:   Initial authentication information for the node
(optional)
:type auth:   :class:`.NodeAuthSSHKey` or :class:`NodeAuthPassword`
:param ex_resource_group:  The resource group in which to create the
node
:type ex_resource_group: ``str``
:param ex_storage_account:  The storage account id in which to store
the node\'s disk image.
Note: when booting from a user image (AzureVhdImage)
the source image and the node image must use the same storage account.
:type ex_storage_account: ``str``
:param ex_blob_container:  The name of the blob container on the
storage account in which to store the node\'s disk image (optional,
default "vhds")
:type ex_blob_container: ``str``
:param ex_user_name:  User name for the initial admin user
(optional, default "azureuser")
:type ex_user_name: ``str``
:param ex_network: The virtual network the node will be attached to.
Must provide either `ex_network` (to create a default NIC for the
node on the given network) or `ex_nic` (to supply the NIC explicitly).
:type ex_network: ``str``
:param ex_subnet: If ex_network is provided, the subnet of the
virtual network the node will be attached to.  Optional, default
is the "default" subnet.
:type ex_subnet: ``str``
:param ex_nic: A virtual NIC to attach to this Node, from
`ex_create_network_interface` or `ex_get_nic`.
Must provide either `ex_nic` (to supply the NIC explicitly) or
ex_network (to create a default NIC for the node on the
given network).
:type ex_nic: :class:`AzureNic`
:param ex_tags: Optional tags to associate with this node.
:type ex_tags: ``dict``
:param ex_customdata: Custom data that will
be placed in the file /var/lib/waagent/CustomData
https://azure.microsoft.com/en-us/documentation/             articles/virtual-machines-how-to-inject-custom-data/
:type ex_customdata: ``str``
:return: The newly created node.
:rtype: :class:`.Node`'

def create_node(self, name, size, image, auth, ex_resource_group, ex_storage_account, ex_blob_container='vhds', location=None, ex_user_name='azureuser', ex_network=None, ex_subnet=None, ex_nic=None, ex_tags={}, ex_customdata=''):

    if (location is None):
        location = self.default_location
    if (ex_nic is None):
        if (ex_network is None):
            raise ValueError('Must    provide    either    ex_network    or    ex_nic')
        if (ex_subnet is None):
            ex_subnet = 'default'
        subnet_id = ('/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Network/virtualnetworks/%s/subnets/%s' % (self.subscription_id, ex_resource_group, ex_network, ex_subnet))
        subnet = AzureSubnet(subnet_id, ex_subnet, {})
        ex_nic = self.ex_create_network_interface((name + '-nic'), subnet, ex_resource_group, location)
    auth = self._get_and_check_auth(auth)
    target = ('/subscriptions/%s/resourceGroups/%s/providers/Microsoft.Compute/virtualMachines/%s' % (self.subscription_id, ex_resource_group, name))
    n = 0
    while True:
        try:
            instance_vhd = ('https://%s.blob%s/%s/%s-os_%i.vhd' % (ex_storage_account, self.connection.storage_suffix, ex_blob_container, name, n))
            self._ex_delete_old_vhd(ex_resource_group, instance_vhd)
            break
        except LibcloudError:
            n += 1
    if isinstance(image, AzureVhdImage):
        storageProfile = {'osDisk': {'name': 'virtualmachine-osDisk', 'osType': 'linux', 'caching': 'ReadWrite', 'createOption': 'FromImage', 'image': {'uri': image.id}, 'vhd': {'uri': instance_vhd}}}
    elif isinstance(image, AzureImage):
        storageProfile = {'imageReference': {'publisher': image.publisher, 'offer': image.offer, 'sku': image.sku, 'version': image.version}, 'osDisk': {'name': 'virtualmachine-osDisk', 'vhd': {'uri': instance_vhd}, 'caching': 'ReadWrite', 'createOption': 'FromImage'}}
    else:
        raise LibcloudError('Unknown    image    type    %s,expected    one    of    AzureImage,    AzureVhdImage', type(image))
    data = {'id': target, 'name': name, 'type': 'Microsoft.Compute/virtualMachines', 'location': location.id, 'tags': ex_tags, 'properties': {'hardwareProfile': {'vmSize': size.id}, 'storageProfile': storageProfile, 'osProfile': {'computerName': name}, 'networkProfile': {'networkInterfaces': [{'id': ex_nic.id}]}}}
    if ex_customdata:
        data['properties']['osProfile']['customData'] = base64.b64encode(ex_customdata)
    data['properties']['osProfile']['adminUsername'] = ex_user_name
    if isinstance(auth, NodeAuthSSHKey):
        data['properties']['osProfile']['adminPassword'] = binascii.hexlify(os.urandom(20))
        data['properties']['osProfile']['linuxConfiguration'] = {'disablePasswordAuthentication': 'true', 'ssh': {'publicKeys': [{'path': ('/home/%s/.ssh/authorized_keys' % ex_user_name), 'keyData': auth.pubkey}]}}
    elif isinstance(auth, NodeAuthPassword):
        data['properties']['osProfile']['linuxConfiguration'] = {'disablePasswordAuthentication': 'false'}
        data['properties']['osProfile']['adminPassword'] = auth.password
    else:
        raise ValueError('Must    provide    NodeAuthSSHKey    or    NodeAuthPassword    in    auth')
    r = self.connection.request(target, params={'api-version': '2015-06-15'}, data=data, method='PUT')
    node = self._to_node(r.object)
    node.size = size
    node.image = image
    return node
