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_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_create_2nic_instance(self):
        ctx = self.mock_ctx('testcreate2nicinstance')
        current_ctx.set(ctx=ctx)
        ctx.logger.info("BEGIN create 2 NIC VM test: {}".format(ctx.instance.id))

        subnet_name = 'instancesubnet_test_2_' + self.__random_id
        nic_name = 'instance_nic_test_2_' + self.__random_id

        ctx.logger.info("create new subnet")
        ctx.node.properties[constants.SUBNET_KEY] = subnet_name
        ctx.node.properties[constants.SUBNET_ADDRESS_KEY] =\
            "10.0.2.0/24"
        current_ctx.set(ctx=ctx)
        subnet.create(ctx=ctx)
        current_ctx.set(ctx=ctx)
        utils.wait_status(ctx, "subnet",constants.SUCCEEDED, 600)

        ctx.logger.info("create second NIC")
        ctx.node.properties[constants.NETWORK_INTERFACE_KEY] = nic_name
        ctx.node.properties[constants.NIC_PRIMARY_KEY] = True
        ctx.node.properties[constants.AZURE_CONFIG_KEY][constants.SUBNET_KEY] = subnet_name
        for relationship in ctx.instance.relationships:
            if relationship.type == constants.NIC_CONNECTED_TO_SUBNET:
                relationship.target.instance.runtime_properties[constants.SUBNET_KEY] = subnet_name
        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("create VM")
        ctx.node.properties[constants.FLAVOR_KEY] = 'Standard_A3'
        ctx.instance.relationships.append(test_mockcontext.MockRelationshipContext(node_id='test',
            runtime_properties={
                constants.NETWORK_INTERFACE_KEY: nic_name,
                constants.NIC_PRIMARY_KEY: True
            },
            type=constants.INSTANCE_CONNECTED_TO_NIC)
        )
        current_ctx.set(ctx=ctx)
        instance.create(ctx=ctx)
        current_ctx.set(ctx=ctx)
        utils.wait_status(ctx, "instance",constants.SUCCEEDED, 600)

        ctx.logger.info("verify the NIC's number of the instance")
        json = instance.get_json_from_azure()
        self.assertEqual(len(json['properties']['networkProfile']['networkInterfaces']),2)

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

        ctx.logger.info("END create VM test")
    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 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_concurrent_delete_instance(self):
        ctx1 = self.mock_ctx('testconcurrentdelete1', id=1)
        ctx2 = self.mock_ctx('testconcurrentdelete2', id=2)

        ctx1.logger.info("BEGIN concurrent delete VM 1 test")
        ctx2.logger.info("BEGIN concurrent delete VM 2 test")

        ctx1.logger.info("CREATE nic 1")
        current_ctx.set(ctx=ctx1)
        nic.create(ctx=ctx1)
        current_ctx.set(ctx=ctx1)
        utils.wait_status(ctx1, "nic",constants.SUCCEEDED, 600)

        ctx2.logger.info("CREATE nic 2")
        current_ctx.set(ctx=ctx2)
        nic.create(ctx=ctx2)
        current_ctx.set(ctx=ctx2)
        utils.wait_status(ctx2, "nic",constants.SUCCEEDED, 600)

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

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

        ctx1.logger.info("check VM 1 status")
        ctx2.logger.info("check VM 2 status")
        status_vm1 = constants.CREATING
        status_vm2 = constants.CREATING
        while bool(status_vm1 == constants.CREATING or
                   status_vm2 == constants.CREATING) :
            current_ctx.set(ctx=ctx1)
            status_vm1 = instance.get_provisioning_state(ctx=ctx1)
            current_ctx.set(ctx=ctx2)
            status_vm2 = instance.get_provisioning_state(ctx=ctx2)
            time.sleep(TIME_DELAY)

        ctx1.logger.info("check VM 1 creation success")
        self.assertEqual(constants.SUCCEEDED, status_vm1)

        ctx2.logger.info("check VM 2 creation success")
        self.assertEqual(constants.SUCCEEDED, status_vm2)

        def delete_vm(mokctx, queue):
            queue.put(instance.delete(ctx=mokctx))
        queue1 = Queue.Queue()
        queue2 = Queue.Queue()
        vm1 = threading.Thread(target=delete_vm, args=(ctx1,queue1))
        vm2 = threading.Thread(target=delete_vm, args=(ctx2,queue2))

        ctx1.logger.info("delete VM 1")
        vm1.start()

        ctx2.logger.info("delete VM 2")
        vm2.start()

        vm1.join()
        vm2.join()
        
        self.assertEqual(202, queue1.get())
        self.assertEqual(202, queue2.get())

        current_ctx.set(ctx=ctx1)
        ctx1.logger.info("DELETE nic 1")
        nic.delete(ctx=ctx1)

        current_ctx.set(ctx=ctx2)
        ctx2.logger.info("DELETE nic 2")
        nic.delete(ctx=ctx2)

        ctx1.logger.info("END concurrent delete VM 1 test")
        ctx2.logger.info("END concurrent delete VM 2 test")