def test_conflict_availability_set(self):
        ctx = self.mock_ctx('testconflictavailabilityset')
        current_ctx.set(ctx=ctx)
        ctx.logger.info("BEGIN conflict availability_set test")

        ctx.logger.info("create availability_set")
        self.assertEqual(200, availability_set.create(ctx=ctx))

        current_ctx.set(ctx=ctx)
        utils.wait_status(ctx, "availability_set",constants.SUCCEEDED, 600)

        ctx.logger.info("create conflict availability_set")
        self.assertEqual(200, availability_set.create(ctx=ctx))

        ctx.logger.info("delete availability_set")
        self.assertEqual(200, availability_set.delete(ctx=ctx))

        try:
            current_ctx.set(ctx=ctx)
            utils.wait_status(ctx, "availability_set","deleting", 600)
        except utils.WindowsAzureError:
            pass

        ctx.logger.info("delete conflict availability_set")
        self.assertEqual(204, availability_set.delete(ctx=ctx))

        ctx.logger.info("END conflict availability_set test")
    def test_fail_create_datadisk(self):
        # Disks are limited to a maximum of 1TB
        disk = [{'name': 'disk_fail_1',
                 'size': 5000,
                 'deletable': True,
                 'caching': 'None'
               }]

        test_name = 'test-fail-create-datadisk'
        ctx = self.mock_ctx(test_name, disk)
        current_ctx.set(ctx=ctx)
        ctx.logger.info("BEGIN create VM test: {}".format(test_name)) 

        instance.create(ctx=ctx)
        
        current_ctx.set(ctx=ctx)
        utils.wait_status(ctx, 'instance',timeout=900)

        current_ctx.set(ctx=ctx)
        self.assertRaises(utils.WindowsAzureError,
                          datadisks.create,
                          ctx=ctx
                          )

        current_ctx.set(ctx=ctx)
        ctx.logger.info("BEGIN delete VM test: {}".format(test_name)) 
        instance.delete(ctx=ctx)

        try:
            current_ctx.set(ctx=ctx)
            utils.wait_status(ctx, 'instance', 
                              constants.DELETING, timeout=900)
        except utils.WindowsAzureError:
            pass
    def test_conflict_public_ip(self):
        ctx = self.mock_ctx('testconflictip')
        current_ctx.set(ctx=ctx)
        ctx.logger.info("BEGIN conflict public_ip test")

        ctx.logger.info("create public_ip")
        status_code = public_ip.create(ctx=ctx)
        ctx.logger.debug("status_code =" + str(status_code) )
        self.assertTrue(bool((status_code == 200) or (status_code == 201)))
        current_ctx.set(ctx=ctx)
        utils.wait_status(ctx, "public_ip",constants.SUCCEEDED, timeout=600)

        status_code = public_ip.create(ctx=ctx)
        ctx.logger.debug("status_code =" + str(status_code) )
        self.assertTrue(bool((status_code == 200) or (status_code == 201)))

        ctx.logger.info("delete public_ip")
        self.assertEqual(202, public_ip.delete(ctx=ctx))
        try:
            current_ctx.set(ctx=ctx)
            utils.wait_status(ctx, "public_ip","waiting for exception", timeout=600)
        except utils.WindowsAzureError:
            pass

        ctx.logger.info("delete conflict public_ip")
        self.assertEqual(204, public_ip.delete(ctx=ctx))
        
        ctx.logger.info("END conflict public_ip test")
    def test_conflict_storage(self):
        ctx = self.mock_ctx('testconflictstorage')
        current_ctx.set(ctx=ctx)
        ctx.logger.info("BEGIN test conflict storage")

        status_code = storage.create(ctx=ctx)
        ctx.logger.info("status_code : " + str(status_code))
        self.assertTrue(bool((status_code == 200) | (status_code == 202)))
        current_ctx.set(ctx=ctx)
        utils.wait_status(ctx, "storage", constants.SUCCEEDED, timeout=600)
        ctx.logger.info("Storage Account Created")

        ctx.logger.info("Conflict Creating Storage Account")
        self.assertEqual(409, storage.create(ctx=ctx))

        self.assertEqual(200, storage.delete(ctx=ctx))

        ctx.logger.info("Check is Storage Account is release")
        current_ctx.set(ctx=ctx)
        self.assertRaises(utils.WindowsAzureError,
            storage.get_provisioning_state,
            ctx=ctx
        )
        ctx.logger.info("Storage Account Deleted")

        ctx.logger.info("END test conflict storage")
def delete(**_):
    """Delete an instance.

    :param ctx: The Cloudify ctx context.
    :return: The status code of the REST request.
    :rtype: int
    """
    utils.validate_node_property(constants.COMPUTE_KEY, ctx.node.properties)

    azure_config = utils.get_azure_config(ctx)

    subscription_id = azure_config[constants.SUBSCRIPTION_KEY]
    resource_group_name = azure_config[constants.RESOURCE_GROUP_KEY]
    api_version = constants.AZURE_API_VERSION_06
    vm_name = ctx.node.properties[constants.COMPUTE_KEY]

    ctx.logger.info('Deleting vm {}.'.format(vm_name))
    response = connection.AzureConnectionClient().azure_delete(
        ctx,
        ("subscriptions/{}/resourceGroups/{}/providers/Microsoft.Compute" +
         "/virtualMachines/{}?api-version={}").format(subscription_id,
                                                      resource_group_name,
                                                      vm_name, api_version
                                                      )
    )

    # wait vm deletion
    try:
        utils.wait_status(ctx, 'instance', 'waiting for exception')
    except utils.WindowsAzureError:
        pass

    return response.status_code
    def test_delete_public_ip(self):
        ctx = self.mock_ctx('testdeleteip')
        current_ctx.set(ctx=ctx)
        ctx.logger.info("BEGIN public_ip delete test")

        ctx.logger.info("create public ip with deletable propertie set to False")
        ctx.node.properties[constants.DELETABLE_KEY] = False

        status_code = public_ip.create(ctx=ctx)
        ctx.logger.debug("status_code =" + str(status_code) )
        self.assertTrue(bool((status_code == 200) or (status_code == 201)))
        current_ctx.set(ctx=ctx)
        utils.wait_status(ctx, "public_ip",constants.SUCCEEDED, timeout=600)

        ctx.logger.info("not delete public ip")
        self.assertEqual(0, public_ip.delete(ctx=ctx))

        ctx.logger.info("Set deletable propertie to True")
        ctx.node.properties[constants.DELETABLE_KEY] = True

        ctx.logger.info("delete public ip")
        self.assertEqual(202, public_ip.delete(ctx=ctx))

        try:
            current_ctx.set(ctx=ctx)
            utils.wait_status(ctx, "public_ip","waiting for exception", timeout=600)
        except utils.WindowsAzureError:
            pass

        ctx.logger.info("END public_ip delete test")
    def test_delete_subnet(self):
        ctx = self.mock_ctx("testdeletesubnet", cdir="10.0.3.0/24")
        ctx.logger.info("BEGIN test_delete_subnet")

        current_ctx.set(ctx=ctx)
        status_code = subnet.create(ctx=ctx)
        ctx.logger.debug("status_code =" + str(status_code))
        self.assertTrue(bool((status_code == 200) or (status_code == 201)))
        current_ctx.set(ctx=ctx)
        utils.wait_status(ctx, "subnet", constants.SUCCEEDED, timeout=600)

        current_ctx.set(ctx=ctx)
        ctx.logger.info("create subnet with deletable propertie set to False")
        ctx.node.properties[constants.DELETABLE_KEY] = False
        ctx.logger.info("not delete subnet")
        self.assertEqual(0, subnet.delete(ctx=ctx))

        current_ctx.set(ctx=ctx)
        ctx.logger.info("Set deletable propertie to True")
        ctx.node.properties[constants.DELETABLE_KEY] = True
        status_code = subnet.delete(ctx=ctx)
        ctx.logger.debug("status_code =" + str(status_code))
        self.assertTrue(bool((status_code == 202) or (status_code == 204)))

        try:
            current_ctx.set(ctx=ctx)
            utils.wait_status(ctx, "subnet", "waiting for exception", timeout=600)
        except utils.WindowsAzureError:
            pass

        ctx.logger.info("END test_delete_subnet")
    def test_create_storage(self):
        ctx = self.mock_ctx('testcreatestorage')
        current_ctx.set(ctx=ctx)
        ctx.logger.info("BEGIN test create storage")
    
        status_code = storage.create(ctx=ctx)
        ctx.logger.info("status_code : " + str(status_code))
        self.assertTrue(bool((status_code == 200) | (status_code == 202)))
        current_ctx.set(ctx=ctx)
        utils.wait_status(ctx, "storage",constants.SUCCEEDED, timeout=600)
        ctx.logger.info("Storage Account Created")

        keys = storage.get_storage_keys(ctx)
        self.assertIsNotNone(keys)
        self.assertEqual(len(keys), 2)
        ctx.logger.info("Key 1: {}, key 2: {}".format(keys[0], keys[1]))

        self.assertEqual(200, storage.delete(ctx=ctx))
        ctx.logger.info("Checking Storage Account deleted")
        current_ctx.set(ctx=ctx)
        self.assertRaises(utils.WindowsAzureError,
            storage.get_provisioning_state,
            ctx=ctx
        )
        ctx.logger.info("Storage Account Deleted")

        ctx.logger.info("END test create storage")
    def test_delete(self):
        ctx = self.mock_ctx('testdeletenic')
        current_ctx.set(ctx=ctx)
        ctx.logger.info("BEGIN delete NIC test")

        ctx.logger.info("create NIC")
        status_code = nic.create(ctx=ctx)
        ctx.logger.debug("status_code = " + str(status_code) )
        self.assertTrue(bool((status_code == 200) or (status_code == 201)))

        current_ctx.set(ctx=ctx)
        utils.wait_status(ctx, "nic",constants.SUCCEEDED, 600)  

        ctx.logger.info("trying to delete an non-deletable nic")
        ctx.node.properties[constants.DELETABLE_KEY] = False
        current_ctx.set(ctx=ctx)
        self.assertEqual(0, nic.delete(ctx=ctx))

        ctx.logger.info("delete NIC")
        ctx.node.properties[constants.DELETABLE_KEY] = True
        current_ctx.set(ctx=ctx)
        self.assertEqual(202, nic.delete(ctx=ctx))

        ctx.logger.info("check is nic is release")
        try:
            current_ctx.set(ctx=ctx)
            utils.wait_status(ctx, "nic","deleting", 600)
        except utils.WindowsAzureError:
            pass

        ctx.logger.info("END delete NIC test")
    def test_delete_storage(self):
        ctx = self.mock_ctx('testdeletestorage')
        current_ctx.set(ctx=ctx)
        ctx.logger.info("BEGIN test delete storage")

        status_code = storage.create(ctx=ctx)
        ctx.logger.info("status_code : " + str(status_code))
        self.assertTrue(bool((status_code == 200) | (status_code == 202)))
        current_ctx.set(ctx=ctx)
        utils.wait_status(ctx, "storage",constants.SUCCEEDED, timeout=600)

        ctx.logger.info("create storage with deletable propertie set to False")
        ctx.node.properties[constants.DELETABLE_KEY] = False
        
        ctx.logger.info("not delete storage")
        self.assertEqual(0, storage.delete(ctx=ctx))

        ctx.logger.info("Set deletable propertie to True")
        ctx.node.properties[constants.DELETABLE_KEY] = True

        ctx.logger.info("Delete storage")
        self.assertEqual(200, storage.delete(ctx=ctx))

        ctx.logger.info("Checking Storage Account deleted")
        current_ctx.set(ctx=ctx)
        self.assertRaises(utils.WindowsAzureError,
            storage.get_provisioning_state,
            ctx=ctx
        )
        ctx.logger.info("Storage Account Deleted")

        ctx.logger.info("END test delete storage")
    def test_create_windows_instance(self):
        ctx = self.mock_ctx('testwin')
        ctx.node.properties[constants.IMAGE_KEY
                            ][constants.PUBLISHER_KEY] = \
            'MicrosoftWindowsServer'
        ctx.node.properties[constants.IMAGE_KEY
                            ][constants.OFFER_KEY] = 'WindowsServer'
        ctx.node.properties[constants.IMAGE_KEY
                            ][constants.SKU_KEY] = '2012-R2-Datacenter'
        ctx.node.properties[constants.WINDOWS_AUTOMATIC_UPDATES_KEY] = True

        current_ctx.set(ctx=ctx)
        ctx.logger.info("BEGIN create windows VM test")

        ctx.logger.info("Creating VM...")
        instance.create(ctx=ctx)

        current_ctx.set(ctx=ctx)
        jsonVM = instance.get_json_from_azure(ctx=ctx)

        self.assertIsNotNone(jsonVM['properties']['osProfile'][
                                    'windowsConfiguration'])
        current_ctx.set(ctx=ctx)
        utils.wait_status(ctx, "instance",constants.SUCCEEDED, 600)

        ctx.logger.info("delete windows VM")
        self.assertEqual(202, instance.delete(ctx=ctx))

        ctx.logger.info("END create windows VM test")
    def test_conflict(self):
        ctx = self.mock_ctx('testconflictnic')
        current_ctx.set(ctx=ctx)
        ctx.logger.info("BEGIN conflict NIC test")

        ctx.logger.info("create NIC")
        status_code = nic.create(ctx=ctx)
        ctx.logger.debug("status_code = " + str(status_code) )
        self.assertTrue(bool((status_code == 200) or (status_code == 201)))
        current_ctx.set(ctx=ctx)
        utils.wait_status(ctx, "nic",constants.SUCCEEDED, 600)  

        ctx.logger.info("create NIC conflict")
        status_code = nic.create(ctx=ctx)
        ctx.logger.debug("status_code =" + str(status_code) )
        self.assertTrue(bool((status_code == 200) or (status_code == 201)))

        ctx.logger.info("delete NIC")
        self.assertEqual(202, nic.delete(ctx=ctx))

        ctx.logger.info("check is NIC is release")
        try:
            current_ctx.set(ctx=ctx)
            utils.wait_status(ctx, "nic","deleting", 600)
        except utils.WindowsAzureError:
            pass

        ctx.logger.info("delete conflict NIC")
        self.assertEqual(204, nic.delete(ctx=ctx))

        ctx.logger.info("END conflict NIC  test")
    def test_nicInUse_instance(self):
        ctx1 = self.mock_ctx('testnicinuse')
        ctx2 = self.mock_ctx('testnicinuse2')
        ctx1.logger.info("BEGIN nicInUse test")

        current_ctx.set(ctx=ctx1)
        ctx1.logger.info("create VM")
        instance.create(ctx=ctx1)
        current_ctx.set(ctx=ctx1)
        utils.wait_status(ctx1, "instance",constants.SUCCEEDED, 600)

        ctx1.logger.info("VM creation conflict nicInUse")
        self.assertRaises(utils.WindowsAzureError,
                         instance.create,
                         ctx=ctx2
                         )

        ctx1.logger.info("delete VM")
        self.assertEqual(202, instance.delete(ctx=ctx1))

        current_ctx.set(ctx=ctx1)
        ctx1.logger.info("check vm provisionning state in a deleted machine")
        self.assertRaises(
                          utils.WindowsAzureError,
                          instance.get_provisioning_state,
                          ctx=ctx1
                          )

        ctx1.logger.info("END conflict VM test")
        time.sleep(TIME_DELAY)
    def test_delete_security_group(self):
        ctx = self.mock_ctx('testdeletesecuritygroup')
        current_ctx.set(ctx=ctx)
        ctx.logger.info("BEGIN delete security_group test")

        ctx.logger.info("create security_group")
        self.assertEqual(201, security_group.create(ctx=ctx))

        current_ctx.set(ctx=ctx)
        utils.wait_status(ctx, "security_group",constants.SUCCEEDED, 600)

        ctx.logger.info("trying to delete an non-deletable security_group")
        ctx.node.properties[constants.DELETABLE_KEY] = False
        current_ctx.set(ctx=ctx)
        self.assertEqual(0, security_group.delete(ctx=ctx))

        ctx.logger.info("delete security_group")
        ctx.node.properties[constants.DELETABLE_KEY] = True
        current_ctx.set(ctx=ctx)
        self.assertEqual(202, security_group.delete(ctx=ctx))

        try:
            current_ctx.set(ctx=ctx)
            utils.wait_status(ctx, "security_group","deleting", 600)
        except utils.WindowsAzureError:
            pass

        ctx.logger.info("END delete security_group test")
    def test_conflict_security_group(self):
        ctx = self.mock_ctx('testconflictsecuritygroup')
        current_ctx.set(ctx=ctx)
        ctx.logger.info("BEGIN conflict security_group test")

        ctx.logger.info("create security_group")
        self.assertEqual(201, security_group.create(ctx=ctx))

        current_ctx.set(ctx=ctx)
        utils.wait_status(ctx, "security_group",constants.SUCCEEDED, 600)

        ctx.logger.info("create conflict security_group")
        self.assertEqual(200, security_group.create(ctx=ctx))

        ctx.logger.info("delete security_group")
        self.assertEqual(202, security_group.delete(ctx=ctx))

        try:
            current_ctx.set(ctx=ctx)
            utils.wait_status(ctx, "security_group","deleting", 600)
        except utils.WindowsAzureError:
            pass

        ctx.logger.info("delete conflict security_group")
        self.assertEqual(204, security_group.delete(ctx=ctx))

        ctx.logger.info("END conflict security_group test")
    def test_conflict_resource_group(self):
        ctx = self.mock_ctx('conflictgroup')
        current_ctx.set(ctx=ctx)
        ctx.logger.info("BEGIN resource_group conflict test")
        ctx.logger.info("create resource group")
        status_code = resource_group.create(ctx=ctx)
        ctx.logger.debug("status_code = " + str(status_code) )
        self.assertTrue(bool((status_code == 200) or (status_code == 201)))
        current_ctx.set(ctx=ctx)
        utils.wait_status(ctx, "resource_group",constants.SUCCEEDED, timeout=600)    

        ctx.logger.info("conflict create resource group")
        status_code = resource_group.create(ctx=ctx)
        ctx.logger.debug("status_code = " + str(status_code) )
        self.assertTrue(bool((status_code == 200) or (status_code == 201)))

        ctx.logger.info("delete resource_group")
        current_ctx.set(ctx=ctx)
        self.assertEqual(202, resource_group.delete(ctx=ctx))
        
        try:
            current_ctx.set(ctx=ctx)
            utils.wait_status(ctx, "resource_group","waiting for exception", timeout=600)
        except utils.WindowsAzureError:
            pass

        ctx.logger.info("END resource_group conflict test")
def create(**_):
    """Create a resource group.

    :param ctx: The Cloudify ctx context.
    :return: The status code of the REST request.
    :rtype: int
    """
    utils.validate_node_property(constants.RESOURCE_GROUP_KEY, ctx.node.properties)

    azure_config = utils.get_azure_config(ctx)
    
    subscription_id = azure_config[constants.SUBSCRIPTION_KEY]
    location = azure_config[constants.LOCATION_KEY]
    api_version = constants.AZURE_API_VERSION_04_PREVIEW
    resource_group_name = ctx.node.properties[constants.RESOURCE_GROUP_KEY]

    json ={"location": str(location)}

    ctx.logger.info('Beginning resource_group creation')
    cntn = connection.AzureConnectionClient()

    response = cntn.azure_put(ctx, 
                   ("subscriptions/{}/resourcegroups/{}" +
                    "?api-version={}").format(
                                            subscription_id, 
                                            resource_group_name, 
                                            api_version
                                            ),
                    json=json
                    )
    
    utils.wait_status(ctx, 'resource_group')

    return response.status_code
    def test_create_too_much_datadisks(self):
        disks = [{'name': 'much_disks_1',
                  'size': 100,
                  'deletable': False,
                  'caching': 'None'
                },{'name': 'much_disks_2',
                   'size': 200,
                   'deletable': False,
                   'caching': 'ReadWrite'
                },{'name': 'much_disks_3',
                   'size': 200,
                   'deletable': False,
                   'caching': 'ReadOnly'
                }]

        test_name = 'test-create-too-much-datadisks'
        ctx = self.mock_ctx(test_name , disks)
        current_ctx.set(ctx=ctx)
        ctx.logger.info("BEGIN create VM test: {}".format(test_name)) 

        instance.create(ctx=ctx)
        
        current_ctx.set(ctx=ctx)
        utils.wait_status(ctx, 'instance', timeout=900)

        current_ctx.set(ctx=ctx)
        datadisks.create(ctx=ctx)

        current_ctx.set(ctx=ctx)
        json_VM = instance.get_json_from_azure(ctx=ctx)

        self.assertIsNotNone(json_VM['properties'][
                                        'storageProfile']['dataDisks'])

        disks_vm = json_VM['properties']['storageProfile']['dataDisks']

        ctx.logger.debug(disks_vm)

        self.assertNotEqual(len(disks), len(disks_vm))

        self.assertEqual(disks[0]['name'], disks_vm[0]['name'])
        self.assertEqual(disks[0]['size'], disks_vm[0]['diskSizeGB'])
        self.assertEqual(disks[0]['caching'], disks_vm[0]['caching'])

        self.assertEqual(disks[1]['name'], disks_vm[1]['name'])
        self.assertEqual(disks[1]['size'], disks_vm[1]['diskSizeGB'])
        self.assertEqual(disks[1]['caching'], disks_vm[1]['caching'])

        current_ctx.set(ctx=ctx)
        ctx.logger.info("BEGIN delete VM test: {}".format(test_name))
        instance.delete(ctx=ctx)

        try:
            current_ctx.set(ctx=ctx)
            utils.wait_status(ctx, 'instance', 
                              constants.DELETING, timeout=900)
        except utils.WindowsAzureError:
            pass
    def test_delete_datadisk(self):
        disk = [{'name': 'delete_disk',
                  'size': 100,
                  constants.DELETABLE_KEY: True,
                  'caching': 'None'
                },{'name': 'delete_disk_2',
                  'size': 100,
                  constants.DELETABLE_KEY: False,
                  'caching': 'None'
                }]

        test_name = 'test-delete-datadisk'
        ctx = self.mock_ctx(test_name, disk)

        current_ctx.set(ctx=ctx)
        ctx.logger.info("BEGIN create VM test: {}".format(test_name))
        instance.create(ctx=ctx)

        current_ctx.set(ctx=ctx)
        datadisks.create(ctx=ctx)
        
        current_ctx.set(ctx=ctx)
        utils.wait_status(ctx, 'instance',timeout=900)

        current_ctx.set(ctx=ctx)
        ctx.logger.info("BEGIN delete VM test: {}".format(test_name))
        instance.delete(ctx=ctx)

        try:
            current_ctx.set(ctx=ctx)
            utils.wait_status(ctx, 'instance', 
                              constants.DELETING, timeout=900)
        except utils.WindowsAzureError:
            pass

        ctx.logger.info("BEGIN delete datadisk test: {}".format(
                                        disk[0]['name']
                                        )
                        )
        current_ctx.set(ctx=ctx)
        datadisks.delete(ctx=ctx)
        
        list  = datadisks._get_datadisks_from_storage(ctx)
        self.assertFalse(datadisks._is_datadisk_exists(
                                        list,
                                        disk[0]['name']
                                        )
                        )
        ctx.logger.info("Disk {} has been deleted.".format(disk[0]['name']))

        self.assertTrue(datadisks._is_datadisk_exists(
                                        list, 
                                        disk[1]['name']
                                        )
                        )
        ctx.logger.info("Datadisk {} still exists.".format(disk[1]['name']))
def create(**_):
    """
    Create the availability set.

    :return: The int of the status code of the request (200 OK; 404 Not Found).
    :rtype: int
    """
    utils.validate_node_property(constants.AVAILABILITY_SET_KEY, ctx.node.properties)

    azure_config = utils.get_azure_config(ctx)

    subscription_id = azure_config[constants.SUBSCRIPTION_KEY]
    resource_group_name = azure_config[constants.RESOURCE_GROUP_KEY]
    location = azure_config[constants.LOCATION_KEY]
    api_version = constants.AZURE_API_VERSION_05_preview
    availability_set_name = ctx.node.properties[constants.AVAILABILITY_SET_KEY]

    # Place the availability_set name in runtime_properties for relationships
    ctx.instance.runtime_properties[constants.AVAILABILITY_SET_KEY] = \
        availability_set_name

    json ={
        "name": str(availability_set_name),
        "type": "Microsoft.Compute/availabilitySets",
        "location": str(location),
        "properties": {
            "platformUpdateDomainCount": 5,
            "platformFaultDomainCount": 3
        }
    }

    response = connection.AzureConnectionClient().azure_put(ctx,
        ("subscriptions/{}" +
         "/resourceGroups/{}" +
         "/providers/Microsoft.Compute" +
         "/availabilitySets/{}" +
         "?api-version={}").format(
            subscription_id,
            resource_group_name,
            availability_set_name,
            api_version
        ),
        json=json
    )

    # Place the availability_set id in runtime_properties for relationships
    ctx.instance.runtime_properties[constants.AVAILABILITY_ID_KEY] = \
        response.json()['id']

    utils.wait_status(ctx, 'availability_set')

    return response.status_code
    def test_add_public_ip(self):
         ctx = self.mock_ctx('testaddpublicip')
         ctx.logger.info("BEGIN attach public_ip to NIC test")
    
         ctx.logger.info("create NIC")
         current_ctx.set(ctx=ctx)
         nic.create(ctx=ctx)

         current_ctx.set(ctx=ctx)
         utils.wait_status(ctx, "nic", constants.SUCCEEDED, 600)
    
         ctx.logger.info("attach public_ip to NIC: {}".format(ctx.instance.runtime_properties['subnet_id']))
    
         ctx_rel = self.mock_relationship_ctx('testaddpublicip', ctx.instance.runtime_properties['subnet_id'])
         current_ctx.set(ctx=ctx_rel)
         nic.add_public_ip(ctx=ctx_rel)
    
         current_ctx.set(ctx=ctx)
         utils.wait_status(ctx, "nic", constants.SUCCEEDED, 600)
    
         ctx.logger.info('Checking if Public IP is correctly set')
         current_ctx.set(ctx=ctx_rel)
         response = (connection.AzureConnectionClient().azure_get(
                                    ctx,
                                    ("subscriptions/{}" + 
                                    "/resourceGroups/{}/providers/" + 
                                    "microsoft.network/networkInterfaces/{}"
                                    "?api-version={}"
                                    ).format(test_utils.SUBSCRIPTION_ID, 
                                             'nic_resource_group_test' + self.__random_id, 
                                             ctx.node.properties[constants.NETWORK_INTERFACE_KEY],
                                             constants.AZURE_API_VERSION_06
                                             )
                                    )
                     ).json()
         public_ip_id = nic.get_public_ip_id(ctx=ctx_rel)

         self.assertEqual(response['properties']['ipConfigurations'][
                          0]['properties']['publicIPAddress']['id'], public_ip_id)
         ctx.logger.info("DELETING NIC")
         current_ctx.set(ctx=ctx)
         self.assertEqual(202, nic.delete(ctx=ctx))
    
         ctx.logger.info("Check if NIC is released.")
         current_ctx.set(ctx=ctx)
         self.assertRaises(utils.WindowsAzureError,
                           nic.get_provisioning_state,
                           ctx=ctx
                           )
    
         ctx.logger.info("END add public ip NIC test")
    def test_delete_instance(self):    
        ctx = self.mock_ctx('testdeleteinstance')
        current_ctx.set(ctx=ctx)
        ctx.logger.info("BEGIN delete VM test")
    
        ctx.logger.info("create VM")    
        instance.create(ctx=ctx) 
        current_ctx.set(ctx=ctx)
        utils.wait_status(ctx, "instance",constants.SUCCEEDED, 600)
        
        ctx.logger.info("delete VM")
        self.assertEqual(202, instance.delete(ctx=ctx))

        ctx.logger.info("END delete VM test")
def create(**_):
    """Create a public ip.

    :param ctx: The Cloudify ctx context.
    :return: The status code of the REST request.
    :rtype: int
    """
    utils.validate_node_property(constants.PUBLIC_IP_KEY, ctx.node.properties)

    azure_config = utils.get_azure_config(ctx)

    subscription_id = azure_config[constants.SUBSCRIPTION_KEY]
    resource_group_name = azure_config[constants.RESOURCE_GROUP_KEY]
    location = azure_config[constants.LOCATION_KEY]
    api_version = constants.AZURE_API_VERSION_06
    public_ip_name = ctx.node.properties[constants.PUBLIC_IP_KEY] 
    public_ip_allocation_method = "Dynamic"

    # Place the public_ip name in runtime_properties for relationships
    ctx.instance.runtime_properties[constants.PUBLIC_IP_KEY] = \
        public_ip_name
    
    json ={
       "location": str(location),
       "properties": {
            "publicIPAllocationMethod": str(public_ip_allocation_method)
            }
        }

    cntn = connection.AzureConnectionClient()

    response = cntn.azure_put(ctx, 
                   ("subscriptions/{}/resourcegroups/{}/" +
                    "providers/microsoft.network" +
                    "/publicIPAddresses/{}" +
                    "?api-version={}").format(
                                            subscription_id, 
                                            resource_group_name, 
                                            public_ip_name, 
                                            api_version
                                            ),
                    json=json
                    )

    utils.wait_status(ctx, 'public_ip')

    return response.status_code
    def test_create_instance_from_vhd(self):
        '''To run this test, you need all the required resource to start a machine
        (resource group, storage account, nic). You then have to upload a valid
        bootable VHD on the storage account. Note the vhd's endpoint and replace 
        MY_URI_VHD by this value.
        Then, you can run the test.
        Note the resource group will not be deleted by the class teardown.
        '''
        ctx = self.mock_ctx('testinstancevhd')
        ctx.node.properties[constants.AZURE_CONFIG_KEY
                            ][constants.RESOURCE_GROUP_KEY] = MY_RESOURCE_GROUP
        ctx.node.properties[constants.AZURE_CONFIG_KEY
                            ][constants.STORAGE_ACCOUNT_KEY] = MY_STORAGE_ACCOUNT
        ctx.node.properties[constants.NETWORK_INTERFACE_KEY] = MY_NIC
        ctx.node.properties[constants.IMAGE_KEY] = {}
        ctx.node.properties[constants.IMAGE_KEY
                            ][constants.OS_URI_KEY] = MY_URI_VHD
        ctx.node.properties[constants.IMAGE_KEY
                            ][constants.OS_TYPE_KEY] = 'Linux'

        current_ctx.set(ctx=ctx)
        ctx.logger.info("BEGIN create VM test: {}".format(ctx.instance.id))
        ctx.logger.info("create VM") 

        instance.create(ctx=ctx) 
        current_ctx.set(ctx=ctx)
        utils.wait_status(ctx, "instance",constants.SUCCEEDED, 600)

        current_ctx.set(ctx=ctx)
        jsonVM = instance.get_json_from_azure(ctx=ctx)

        self.assertEqual(jsonVM['properties']['storageProfile'
                                              ]['osDisk']['osType'],  
                         ctx.node.properties[constants.IMAGE_KEY
                            ][constants.OS_TYPE_KEY]
                         )

        self.assertEqual(jsonVM['properties']['storageProfile'
                                              ]['osDisk']['image']['uri'],
                         ctx.node.properties[constants.IMAGE_KEY
                            ][constants.OS_URI_KEY]
                         )

        ctx.logger.info("delete VM")
        self.assertEqual(202, instance.delete(ctx=ctx))

        ctx.logger.info("END create VM test")
    def test_create_datadisk(self):
        disk = [{'name': 'disk_1',
                 'size': 100,
                 'deletable': False,
                 'caching': 'None'
               }]

        test_name = 'test-create-datadisk'
        ctx = self.mock_ctx(test_name, disk)
        current_ctx.set(ctx=ctx)
        ctx.logger.info("BEGIN create VM test: {}".format(test_name)) 

        instance.create(ctx=ctx)
        current_ctx.set(ctx=ctx)
        utils.wait_status(ctx, 'instance', constants.SUCCEEDED, timeout=900)

        current_ctx.set(ctx=ctx)
        datadisks.create(ctx=ctx)

        current_ctx.set(ctx=ctx)
        json_VM = instance.get_json_from_azure(ctx=ctx)

        ctx.logger.debug(json_VM)

        self.assertIsNotNone(json_VM['properties'][
                                        'storageProfile']['dataDisks'])
        
        disks_vm = json_VM['properties']['storageProfile']['dataDisks']

        ctx.logger.debug(disks_vm)

        self.assertEqual(disk[0]['name'], disks_vm[0]['name'])
        self.assertEqual(disk[0]['caching'], disks_vm[0]['caching'])
        self.assertEqual(disk[0]['size'], disks_vm[0]['diskSizeGB'])

        current_ctx.set(ctx=ctx)
        ctx.logger.info("BEGIN delete VM test: {}".format(test_name)) 
        instance.delete(ctx=ctx)

        try:
            current_ctx.set(ctx=ctx)
            utils.wait_status(ctx, 'instance', 
                              constants.DELETING, timeout=900)
        except utils.WindowsAzureError:
            pass
    def setUpClass(self): 
        ctx = self.mock_ctx('init','')
        ctx.logger.info("BEGIN test datadisk number "\
                                + self.__random_id)   
        current_ctx.set(ctx=ctx)
        ctx.logger.info("CREATE ressource_group")
        resource_group.create(ctx=ctx)
        current_ctx.set(ctx=ctx)
        utils.wait_status(ctx, "resource_group", 
                          constants.SUCCEEDED, timeout=600)

        current_ctx.set(ctx=ctx)
        ctx.logger.info("CREATE storage account")
        ctx.node.properties[constants.ACCOUNT_TYPE_KEY] = "Standard_LRS"
        storage.create(ctx=ctx)
        current_ctx.set(ctx=ctx)
        utils.wait_status(ctx, "storage",constants.SUCCEEDED, timeout=600)

        ctx.logger.info("CREATE network")
        current_ctx.set(ctx=ctx)
        ctx.node.properties[constants.VIRTUAL_NETWORK_ADDRESS_KEY] = \
            "10.0.0.0/16"
        network.create(ctx=ctx) 
        current_ctx.set(ctx=ctx)
        utils.wait_status(ctx, "network",constants.SUCCEEDED, timeout=600)

        ctx.logger.info("CREATE subnet")
        current_ctx.set(ctx=ctx)

        ctx.node.properties[constants.SUBNET_ADDRESS_KEY] = "10.0.1.0/24"
        ctx.instance.runtime_properties[constants.VIRTUAL_NETWORK_KEY] =\
            "diskvirtualnetwork_test" + self.__random_id

        subnet.create(ctx=ctx) 
        current_ctx.set(ctx=ctx)
        utils.wait_status(ctx, "subnet",constants.SUCCEEDED, timeout=600)
      
        ctx.logger.info("CREATE NIC")
        current_ctx.set(ctx=ctx)
       
        nic.create(ctx=ctx)
        current_ctx.set(ctx=ctx)
        utils.wait_status(ctx, "nic",constants.SUCCEEDED, timeout=600)
    def test_add_availability_set_instance(self):
        ctx = self.mock_ctx('testaddavailabilityinstance')
        current_ctx.set(ctx=ctx)
        ctx.logger.info("BEGIN add availability set VM test: {}".format(ctx.instance.id))

        ctx.logger.info("create availability_set")
        self.assertEqual(200, availability_set.create(ctx=ctx))
        ctx.logger.debug("availability_set_id = {}".format(
            ctx.instance.runtime_properties[constants.AVAILABILITY_ID_KEY]))

        ctx.instance.relationships.append(test_mockcontext.MockRelationshipContext(node_id='test',
            runtime_properties={
                constants.AVAILABILITY_ID_KEY:\
                     ctx.instance.runtime_properties[constants.AVAILABILITY_ID_KEY]
            },
            type=constants.INSTANCE_CONTAINED_IN_AVAILABILITY_SET)
        )

        ctx.logger.info("create VM")
        instance.create(ctx=ctx)

        current_ctx.set(ctx=ctx)
        utils.wait_status(ctx, "instance",constants.SUCCEEDED, 600)

        ctx.logger.info("test instance is in availability_set")
        current_ctx.set(ctx=ctx)
        json = instance.get_json_from_azure(ctx=ctx)
        self.assertIsNotNone(json['properties']['availabilitySet'])
        self.assertEqual(str(json['properties']['availabilitySet']['id']).lower(),
            str(ctx.instance.runtime_properties[constants.AVAILABILITY_ID_KEY]).lower()
        )

        ctx.logger.info("delete VM")
        self.assertEqual(202, instance.delete(ctx=ctx))

        ctx.logger.info("delete availability_set")
        self.assertEqual(200, availability_set.delete(ctx=ctx))

        ctx.logger.info("END create VM test")
    def test_storage_relationship_instance(self):
        ctx = self.mock_ctx('teststorelainstance')
        current_ctx.set(ctx=ctx)
        ctx.logger.info("BEGIN storage relationship VM test: {}".format(ctx.instance.id))

        ctx.instance.relationships.append(test_mockcontext.MockRelationshipContext(node_id='test',
            runtime_properties={
                constants.STORAGE_ACCOUNT_KEY:\
                     ctx.node.properties[constants.STORAGE_ACCOUNT_KEY]
            },
            type=constants.INSTANCE_CONNECTED_TO_STORAGE_ACCOUNT)
        )

        ctx.logger.info("create VM")
        instance.create(ctx=ctx)

        current_ctx.set(ctx=ctx)
        utils.wait_status(ctx, "instance",constants.SUCCEEDED, 600)

        ctx.logger.info("delete VM")
        self.assertEqual(202, instance.delete(ctx=ctx))

        ctx.logger.info("END create VM test")
    def test_create_subnet(self):
        ctx = self.mock_ctx("testcreatesubnet", cdir="10.0.2.0/24")
        ctx.logger.info("BEGIN test_create_subnet")

        current_ctx.set(ctx=ctx)
        status_code = subnet.create(ctx=ctx)
        ctx.logger.debug("status_code = " + str(status_code))
        self.assertTrue(bool((status_code == 200) or (status_code == 201)))

        current_ctx.set(ctx=ctx)
        utils.wait_status(ctx, "subnet", constants.SUCCEEDED, timeout=600)

        current_ctx.set(ctx=ctx)
        status_code = subnet.delete(ctx=ctx)
        ctx.logger.debug("status_code = " + str(status_code))
        self.assertTrue(bool((status_code == 202) or (status_code == 204)))

        try:
            current_ctx.set(ctx=ctx)
            utils.wait_status(ctx, "subnet", "waiting for exception", timeout=600)
        except utils.WindowsAzureError:
            pass

        ctx.logger.info("END test_create_subnet")
    def test_connect_security_group_subnet(self):
        ctx = self.mock_ctx("testaddsecugroupsubnet", cdir="10.0.5.0/24")
        ctx.logger.info("BEGIN test_connect_security_group_subnet")

        ctx.logger.info("create security_group")
        self.assertEqual(201, security_group.create(ctx=ctx))
        ctx.logger.debug(
            "security_group_id = {}".format(ctx.instance.runtime_properties[constants.SECURITY_GROUP_ID_KEY])
        )
        current_ctx.set(ctx=ctx)
        utils.wait_status(ctx, "security_group", constants.SUCCEEDED, timeout=900)

        ctx.instance.relationships.append(
            test_mockcontext.MockRelationshipContext(
                node_id="test",
                runtime_properties={
                    constants.SECURITY_GROUP_ID_KEY: ctx.instance.runtime_properties[constants.SECURITY_GROUP_ID_KEY]
                },
                type=constants.SUBNET_CONNECTED_TO_SECURITY_GROUP,
            )
        )

        current_ctx.set(ctx=ctx)
        status_code = subnet.create(ctx=ctx)
        ctx.logger.debug("status_code = " + str(status_code))
        self.assertTrue(bool((status_code == 200) or (status_code == 201)))

        current_ctx.set(ctx=ctx)
        utils.wait_status(ctx, "subnet", constants.SUCCEEDED, timeout=600)

        ctx.logger.info("test subnet is connected to a security_group")
        current_ctx.set(ctx=ctx)
        json = subnet.get_json_from_azure(ctx=ctx)
        self.assertIsNotNone(json["properties"]["networkSecurityGroup"])
        self.assertEqual(
            str(json["properties"]["networkSecurityGroup"]["id"]).lower(),
            str(ctx.instance.runtime_properties[constants.SECURITY_GROUP_ID_KEY]).lower(),
        )

        current_ctx.set(ctx=ctx)
        status_code = subnet.delete(ctx=ctx)
        ctx.logger.debug("status_code = " + str(status_code))
        self.assertTrue(bool((status_code == 202) or (status_code == 204)))

        try:
            current_ctx.set(ctx=ctx)
            utils.wait_status(ctx, "subnet", "waiting for exception", timeout=600)
        except utils.WindowsAzureError:
            pass

        ctx.logger.info("delete security_group")
        self.assertEqual(202, security_group.delete(ctx=ctx))

        ctx.logger.info("END test_connect_security_group_subnet")