class OrchestrationVMwithMetadata(nuage_base.NuageBaseOrchestrationTest,
                                  NuageBaseTest):
    @classmethod
    def skip_checks(cls):
        super(OrchestrationVMwithMetadata, cls).skip_checks()
        if not CONF.compute_feature_enabled.metadata_service:
            raise cls.skipException('Test requires functional metadata agent')

    @classmethod
    def setup_credentials(cls):
        cls.set_network_resources()
        super(OrchestrationVMwithMetadata, cls).setup_credentials()

    @classmethod
    def setup_clients(cls):
        super(OrchestrationVMwithMetadata, cls).setup_clients()
        cls.floating_ips_client = cls.os_admin.floating_ips_client

    @decorators.attr(type='smoke')
    def test_metadata_agent_on_concurrent_deployment(self):
        """Verifies created neutron resources."""
        neutron_basic_template = self.load_template(
            'concurrent_deployment_of_vms_with_fip')
        keypair = self.create_keypair(manager=self.admin_manager)
        stack_name = data_utils.rand_name('heat')
        user_data = '#!/bin/sh\necho "pass" > /tmp/userdata.out'
        template = self.read_template('concurrent_deployment_of_vms_with_fip')
        network_name = data_utils.rand_name('priv_net')
        parameters = {
            'public_net': CONF.network.public_network_id,
            'private_net_name': network_name,
            'private_net_cidr': '97.0.0.0/24',
            'private_net_gateway': '97.0.0.1',
            'private_net_pool_start': '97.0.0.5',
            'private_net_pool_end': '97.0.0.100',
            'image': CONF.compute.image_ref,
            'flavor': CONF.compute.flavor_ref,
            'key_name': keypair['name'],
            'user_data': user_data
        }
        # create the stack
        stack_identifier = self.create_stack(stack_name, template, parameters)
        stack_id = stack_identifier.split('/')[1]

        self.client.wait_for_stack_status(stack_id, 'CREATE_COMPLETE')
        resources = (self.client.list_resources(stack_identifier)['resources'])

        test_resources = {}
        for resource in resources:
            test_resources[resource['logical_resource_id']] = resource

        resources = [
            ('vm1', neutron_basic_template['resources']['vm1']['type']),
            ('vm2', neutron_basic_template['resources']['vm2']['type']),
            ('vm3', neutron_basic_template['resources']['vm3']['type']),
            ('vm4', neutron_basic_template['resources']['vm4']['type']),
            ('vm5', neutron_basic_template['resources']['vm5']['type']),
            ('vm6', neutron_basic_template['resources']['vm6']['type']),
            ('vm7', neutron_basic_template['resources']['vm7']['type'])
        ]

        for resource_name, resource_type in resources:
            resource = test_resources.get(resource_name, None)
            server = NuageBaseTest.get_server(
                self,
                server_id=resource['physical_resource_id'],
                manager=self.admin_manager)
            fip = None
            for net in server['addresses'][network_name]:
                if net['OS-EXT-IPS:type'] == 'floating':
                    fip = net['addr']
            self.fip_acs = RemoteClient(
                ip_address=fip,
                username=CONF.validation.image_ssh_user,
                pkey=keypair['private_key'])
            self.assertTrue(
                test_utils.call_until_true(self.is_userdata_ready, 300, 30))
        self._clear_stacks()

    def is_userdata_ready(self):
        try:
            return 'pass' in self.fip_acs.exec_command('cat /tmp/userdata.out')
        except exceptions.SSHExecCommandFailed:
            return False