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_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_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_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")