예제 #1
0
    def __init__(self, *args, **kwargs):
        super(FunctionalTest, self).__init__(*args, **kwargs)
        suppress_dependency_logging()

        if not config_ini:
            raise ConfFileError('Configuration file parameter'
                                ' --tc-file is missing or '
                                'the file has wrong format')

        self.src_cloud = Prerequisites(cloud_prefix='SRC',
                                       configuration_ini=config_ini,
                                       config=config)
        self.dst_cloud = Prerequisites(cloud_prefix='DST',
                                       configuration_ini=config_ini,
                                       config=config)
        self.filtering_utils = utils.FilteringUtils()
        self.migration_utils = utils.MigrationUtils(config)
예제 #2
0
 def __init__(self, *args, **kwargs):
     super(FunctionalTest, self).__init__(*args, **kwargs)
     suppress_dependency_logging()
     self.src_cloud = Prerequisites(cloud_prefix="SRC", config=config)
     self.dst_cloud = Prerequisites(cloud_prefix="DST", config=config)
     self.filtering_utils = FilteringUtils()
예제 #3
0
class FunctionalTest(unittest.TestCase):
    def __init__(self, *args, **kwargs):
        super(FunctionalTest, self).__init__(*args, **kwargs)
        suppress_dependency_logging()
        self.src_cloud = Prerequisites(cloud_prefix="SRC", config=config)
        self.dst_cloud = Prerequisites(cloud_prefix="DST", config=config)
        self.filtering_utils = FilteringUtils()

    def filter_networks(self):
        networks = [i["name"] for i in config.networks]
        for i in config.tenants:
            if "networks" in i:
                for j in i["networks"]:
                    networks.append(j["name"])
        return self._get_neutron_resources("networks", networks)

    # TODO(raies): Currently we support filtering of those subnets which has
    # 'name' parameter in it's detail.
    # Implimentation of Subnet filtering for no name subnets is still needed.
    def filter_subnets(self):
        subnets = [i["name"] for i in config.subnets]
        for i in config.tenants:
            if "subnets" in i:
                for subnet in i["subnets"]:
                    subnets.append(subnet["name"])
        return self._get_neutron_resources("subnets", subnets)

    def filter_routers(self):
        routers = [i["router"]["name"] for i in config.routers]
        return self._get_neutron_resources("routers", routers)

    def filter_floatingips(self):
        # Now we create floating ip, after tenant networks created.
        # Will be fixed with tests for floating ip associating
        def get_fips(_user):
            self.src_cloud.switch_user(user=_user["name"], tenant=_user["tenant"], password=_user["password"])
            _client = self.src_cloud.neutronclient
            return [_fip["floating_ip_address"] for _fip in _client.list_floatingips()["floatingips"]]

        for tenant in config.tenants:
            fips = [
                fip
                for user in config.users
                if tenant["name"] == user.get("tenant") and user["enabled"] and not user.get("deleted")
                for fip in get_fips(user)
            ]
            return set(fips)

    def filter_users(self):
        users = []
        for user in config.users:
            if user.get("deleted"):
                continue
            if self._tenant_exists(user.get("tenant")) or self._user_has_not_primary_tenants(user["name"]):
                users.append(user["name"])
        return self._get_keystone_resources("users", users)

    def filter_tenants(self):
        tenants = [i["name"] for i in config.tenants]
        return self._get_keystone_resources("tenants", tenants)

    def filter_roles(self):
        roles = [i["name"] for i in config.roles]
        return self._get_keystone_resources("roles", roles)

    def filter_vms(self):
        vms = config.vms
        [vms.extend(i["vms"]) for i in config.tenants if "vms" in i]
        vms_names = [vm["name"] for vm in vms]
        opts = {"search_opts": {"all_tenants": 1}}
        return [i for i in self.src_cloud.novaclient.servers.list(**opts) if i.name in vms_names]

    def filter_flavors(self):
        flavors = [i["name"] for i in config.flavors]
        return self._get_nova_resources("flavors", flavors)

    def filter_keypairs(self):
        keypairs = [i["name"] for i in config.keypairs]
        return self._get_nova_resources("keypairs", keypairs)

    def filter_security_groups(self):
        sgs = [sg["name"] for i in config.tenants if "security_groups" in i for sg in i["security_groups"]]
        return self._get_neutron_resources("security_groups", sgs)

    def filter_images(self):
        images = [i["name"] for i in config.images]
        for tenant in config.tenants:
            if not tenant.get("images"):
                continue
            [images.append(i["name"]) for i in tenant["images"]]
        return [i for i in self.src_cloud.glanceclient.images.list() if i.name in images]

    def filter_volumes(self):
        volumes = [i["name"] for i in config.cinder_volumes]
        opts = {"search_opts": {"all_tenants": 1}}
        return [i for i in self.src_cloud.cinderclient.volumes.list(**opts) if i.display_name in volumes]

    def _get_neutron_resources(self, res, names):
        _list = getattr(self.src_cloud.neutronclient, "list_" + res)()
        return {res: [i for i in _list[res] if i["name"] in names]}

    def _get_nova_resources(self, res, names):
        client = getattr(self.src_cloud.novaclient, res)
        return [i for i in client.list() if i.name in names]

    def _get_keystone_resources(self, res, names):
        client = getattr(self.src_cloud.keystoneclient, res)
        return [i for i in client.list() if i.name in names]

    def _tenant_exists(self, tenant_name):
        try:
            self.src_cloud.get_tenant_id(tenant_name)
            return True
        except IndexError:
            return False

    def _user_has_not_primary_tenants(self, user_name):
        user_id = self.src_cloud.get_user_id(user_name)
        for tenant in self.src_cloud.keystoneclient.tenants.list():
            if self.src_cloud.keystoneclient.roles.roles_for_user(user=user_id, tenant=tenant.id):
                return True
        return False

    def get_vms_with_fip_associated(self):
        vms = config.vms
        [vms.extend(i["vms"]) for i in config.tenants if "vms" in i]
        return [vm["name"] for vm in vms if vm.get("fip")]
예제 #4
0
class FunctionalTest(unittest.TestCase):
    def __init__(self, *args, **kwargs):
        super(FunctionalTest, self).__init__(*args, **kwargs)
        suppress_dependency_logging()
        self.src_cloud = Prerequisites(cloud_prefix='SRC', config=config)
        self.dst_cloud = Prerequisites(cloud_prefix='DST', config=config)
        self.filtering_utils = FilteringUtils()

    def filter_networks(self):
        networks = [i['name'] for i in config.networks]
        for i in config.tenants:
            if 'networks' in i:
                for j in i['networks']:
                    networks.append(j['name'])
        return self._get_neutron_resources('networks', networks)

    def filter_subnets(self):
        subnets = []
        admin_tenant_id = self.src_cloud.get_tenant_id(self.src_cloud.tenant)
        for net in config.networks:
            if not net.get('subnets'):
                continue
            for subnet in net['subnets']:
                subnet['tenant_id'] = admin_tenant_id
                subnets.append(subnet)
        subnets = [i for net in config.networks if net.get('subnets')
                   for i in net['subnets']]
        for tenant in config.tenants:
            if 'networks' not in tenant:
                continue
            for network in tenant['networks']:
                if 'subnets' not in network:
                    continue
                for subnet in network['subnets']:
                    subnet['tenant_id'] = self.src_cloud.get_tenant_id(
                        tenant['name'])
                    subnets.append(subnet)
        env_subnets = self.src_cloud.neutronclient.list_subnets()['subnets']
        filtered_subnets = {'subnets': []}
        for env_subnet in env_subnets:
            for subnet in subnets:
                same_cidr = env_subnet['cidr'] == subnet['cidr']
                same_tenant = env_subnet['tenant_id'] == subnet['tenant_id']
                if same_cidr and same_tenant:
                    filtered_subnets['subnets'].append(env_subnet)
        return filtered_subnets

    def filter_routers(self):
        routers = [i['router']['name'] for i in config.routers]
        return self._get_neutron_resources('routers', routers)

    def filter_floatingips(self):
        # Now we create floating ip, after tenant networks created.
        # Will be fixed with tests for floating ip associating
        def get_fips(_user):
            self.src_cloud.switch_user(user=_user['name'],
                                       tenant=_user['tenant'],
                                       password=_user['password'])
            _client = self.src_cloud.neutronclient
            return [_fip['floating_ip_address']
                    for _fip in _client.list_floatingips()['floatingips']]

        for tenant in config.tenants:
            fips = [fip for user in config.users
                    if tenant['name'] == user.get('tenant') and user['enabled']
                    and not user.get('deleted')
                    for fip in get_fips(user)]
            return set(fips)

    def filter_users(self):
        users = []
        for user in config.users:
            if user.get('deleted'):
                continue
            if self._tenant_exists(user.get('tenant')) or\
                    self._user_has_not_primary_tenants(user['name']):
                users.append(user['name'])
        return self._get_keystone_resources('users', users)

    def filter_tenants(self):
        tenants = [i['name'] for i in config.tenants]
        return self._get_keystone_resources('tenants', tenants)

    def filter_roles(self):
        roles = [i['name'] for i in config.roles]
        return self._get_keystone_resources('roles', roles)

    def filter_vms(self):
        vms = config.vms
        [vms.extend(i['vms']) for i in config.tenants if 'vms' in i]
        vms.extend(config.vms_from_volumes)
        vms_names = [vm['name'] for vm in vms]
        opts = {'search_opts': {'all_tenants': 1}}
        return [i for i in self.src_cloud.novaclient.servers.list(**opts)
                if i.name in vms_names]

    def filter_flavors(self):
        flavors = [i['name'] for i in config.flavors]
        return self._get_nova_resources('flavors', flavors)

    def filter_keypairs(self):
        keypairs = [i['name'] for i in config.keypairs]
        return self._get_nova_resources('keypairs', keypairs)

    def filter_security_groups(self):
        sgs = [sg['name'] for i in config.tenants if 'security_groups' in i
               for sg in i['security_groups']]
        return self._get_neutron_resources('security_groups', sgs)

    def filter_images(self):
        images = [i['name'] for i in config.images]
        for tenant in config.tenants:
            if not tenant.get('images'):
                continue
            [images.append(i['name']) for i in tenant['images']]
        return [i for i in self.src_cloud.glanceclient.images.list()
                if i.name in images]

    def filter_volumes(self):
        volumes = config.cinder_volumes
        [volumes.extend(i['cinder_volumes']) for i in config.tenants
         if 'cinder_volumes' in i]
        volumes.extend(config.cinder_volumes_from_images)
        volumes_names = [volume['display_name'] for volume in volumes]
        opts = {'search_opts': {'all_tenants': 1}}
        return [i for i in self.src_cloud.cinderclient.volumes.list(**opts)
                if i.display_name in volumes_names]

    def _get_neutron_resources(self, res, names):
        _list = getattr(self.src_cloud.neutronclient, 'list_' + res)()
        return {res: [i for i in _list[res] if i['name'] in names]}

    def _get_nova_resources(self, res, names):
        client = getattr(self.src_cloud.novaclient, res)
        return [i for i in client.list()
                if i.name in names]

    def _get_keystone_resources(self, res, names):
        client = getattr(self.src_cloud.keystoneclient, res)
        return [i for i in client.list()
                if i.name in names]

    def _tenant_exists(self, tenant_name):
        try:
            self.src_cloud.get_tenant_id(tenant_name)
            return True
        except NotFound:
            return False

    def _user_has_not_primary_tenants(self, user_name):
        user_id = self.src_cloud.get_user_id(user_name)
        for tenant in self.src_cloud.keystoneclient.tenants.list():
            if self.src_cloud.keystoneclient.roles.roles_for_user(
                    user=user_id, tenant=tenant.id):
                return True
        return False

    def get_vms_with_fip_associated(self):
        vms = config.vms
        [vms.extend(i['vms']) for i in config.tenants if 'vms' in i]
        return [vm['name'] for vm in vms if vm.get('fip')]
예제 #5
0
 def chose_destination_cloud(self, destination):
     self.cloud_info = Prerequisites(cloud_prefix=destination,
                                     config=self.config)
예제 #6
0
class DataCollector(object):
    """
    Class to collect data for existing objects on both clusters. As a result
    returns __dict__ with info for both SRC and DST clusters.
    Methods description:
        - unified_method: method to get resources for each tenant separately in
                          case the resource is specific for each tenant,
                          example key-pairs, security-groups, etc.
        - nova_collector: method to get nova resources, list of resources can
                          be obtained in config.py:
                            config.rollback_params['param_dict']['Nova']
        - cinder_collector: method to get cinder resources, list of resources
                            can be obtained in config.py:
                              config.rollback_params['param_dict']['Cinder']
        - glance_collector: method to get glance resources, list of resources
                            can be obtained in config.py:
                              config.rollback_params['param_dict']['Glance']
        - neutron_collector: method to get neutron resources, list of resources
                             can be obtained in config.py:
                               config.rollback_params['param_dict']['Neutron']
        - keystone_collector: method to get keystone resources, list of
                              resources can be obtained in config.py:
                              config.rollback_params['param_dict']['Keystone']
    """
    def __init__(self, config):
        self.cloud_info = None
        self.migration_utils = FilteringUtils()
        self.main_folder = self.migration_utils.main_folder
        self.config = config

    def chose_destination_cloud(self, destination):
        self.cloud_info = Prerequisites(cloud_prefix=destination,
                                        config=self.config)

    def return_to_admin_privileges(self):
        self.cloud_info.switch_user(user=self.cloud_info.username,
                                    password=self.cloud_info.password,
                                    tenant=self.cloud_info.tenant)

    def form_client_method(self, *arguments):
        client = self.cloud_info
        for argument in arguments:
            client = getattr(client, argument)
        return client()

    def unified_method(self, destination, collected_items, _res, *args):
        main_dict = {}
        if destination == 'SRC':
            for user, key_pair in zip(self.config.users, self.config.keypairs):
                self.cloud_info.switch_user(user=user['name'],
                                            password=user['password'],
                                            tenant=user['tenant'])
                names_list = self.form_client_method(*args)
                instance_list = []
                for instance in names_list:
                    instance_list.append(instance.__dict__['_info'])
                main_dict[user['tenant']] = instance_list
            self.return_to_admin_privileges()
            names_list = self.form_client_method(*args)
            instance_list = []
            for instance in names_list:
                instance_list.append(instance.__dict__['_info'])
            main_dict['admin'] = instance_list
            collected_items[_res] = main_dict
        elif destination == 'DST':
            names_list = self.form_client_method(*args)
            instance_list = []
            for instance in names_list:
                instance_list.append(instance.__dict__['_info'])
            collected_items[_res] = instance_list

    def nova_collector(self, destination, *args):
        """
        Nova data collector method.
        """
        collected_items = {}
        self.chose_destination_cloud(destination)
        for arg in args[0]:
            if arg == 'servers':
                vm_list = []
                servers_list = self.cloud_info.novaclient.servers.list(
                    search_opts={'all_tenants': 1})
                for server in servers_list:
                    vm = server.__dict__['_info']
                    for data in vm.keys():
                        if data == u'updated':
                            del vm[data]
                    vm_list.append(vm)
                collected_items[arg] = vm_list
            elif arg == 'security_groups':
                self.unified_method(destination, collected_items, arg,
                                    'novaclient', arg, 'list')
            elif arg == 'flavors':
                flavor_list = []
                flavors = self.cloud_info.novaclient.flavors.list()
                for inst in flavors:
                    flavor = inst.__dict__
                    flavor_list.append(flavor['_info'])
                collected_items[arg] = flavor_list
            elif arg == 'quotas':
                quotas = {}
                tenant_list = self.cloud_info.keystoneclient.tenants.list()
                for tenant in tenant_list:
                    tenant = tenant.__dict__
                    quota_list = self.cloud_info.novaclient.quotas.get(
                        tenant['id'])
                    quotas[tenant['name']] = quota_list.__dict__['_info']
                collected_items[arg] = quotas
            elif arg == 'keypairs':
                self.unified_method(destination, collected_items, arg,
                                    'novaclient', arg, 'list')
        return collected_items

    def neutron_collector(self, destination, *args):
        """
        Neutron data collector method.
        """
        collected_items = {}
        self.chose_destination_cloud(destination)
        for arg in args[0]:
            if arg == 'networks':
                networks_list = self.cloud_info.neutronclient.list_networks()
                collected_items['networks'] = networks_list['networks']
            elif arg == 'subnets':
                subnets_list = self.cloud_info.neutronclient.list_subnets()
                collected_items['subnets'] = subnets_list['subnets']
            elif arg == 'routers':
                routers_list = self.cloud_info.neutronclient.list_routers()
                collected_items['routers'] = routers_list['routers']
            elif arg == 'ports':
                ports_list = self.cloud_info.neutronclient.list_ports()
                collected_items['ports'] = ports_list['ports']
            elif arg == 'quotas':
                quotas = {}
                tenant_list = self.cloud_info.keystoneclient.tenants.list()
                for tenant in tenant_list:
                    tenant = tenant.__dict__
                    quota_list = self.cloud_info.neutronclient.show_quota(
                        tenant['id'])
                    quotas[tenant['name']] = quota_list
                collected_items[arg] = quotas
        return collected_items

    def keystone_collector(self, destination, *args):
        """
        Keystone data collector method.
        """
        def optimizer(resource_list):
            final_list = []
            for resource in resource_list:
                final_list.append(resource.__dict__['_info'])
            return final_list

        collected_items = {}
        self.chose_destination_cloud(destination)
        for arg in args[0]:
            if arg == 'users':
                user_list = self.cloud_info.keystoneclient.users.list()
                data_list = optimizer(user_list)
                collected_items[arg] = data_list
            elif arg == 'tenants':
                tenant_list = self.cloud_info.keystoneclient.tenants.list()
                data_list = optimizer(tenant_list)
                collected_items[arg] = data_list
            elif arg == 'roles':
                role_list = self.cloud_info.keystoneclient.roles.list()
                data_list = optimizer(role_list)
                collected_items[arg] = data_list
        return collected_items

    def glance_collector(self, destination, *args):
        """
        Glance data collector method.
        """
        collected_items = {}
        self.chose_destination_cloud(destination)
        for arg in args[0]:
            if arg == 'images':
                image_list = [
                    x.__dict__['_info']
                    for x in self.cloud_info.glanceclient.images.list()
                ]
                collected_items[arg] = image_list
            elif arg == 'members':
                members = {}
                image_list = [
                    x.__dict__
                    for x in self.cloud_info.glanceclient.images.list()
                ]
                for image in image_list:
                    member_list = \
                        self.cloud_info.glanceclient.image_members.list(
                            image['id'])
                    final_list = []
                    for member in member_list:
                        final_list.append(member.__dict__['_info'])
                    members[image['name']] = final_list
                collected_items[arg] = members

        return collected_items

    def cinder_collector(self, destination, *args):
        """
        Cinder data collector method.
        """
        collected_items = {}
        self.chose_destination_cloud(destination)
        for arg in args[0]:
            if arg == 'volumes':
                self.unified_method(destination, collected_items, arg,
                                    'cinderclient', arg, 'list')
            elif arg == 'volume_snapshots':
                self.unified_method(destination, collected_items, arg,
                                    'cinderclient', arg, 'list')
            elif arg == 'quotas':
                quotas = {}
                tenant_list = self.cloud_info.keystoneclient.tenants.list()
                for tenant in tenant_list:
                    tenant = tenant.__dict__
                    quota_list = self.cloud_info.cinderclient.quotas.get(
                        tenant['id'])
                    quotas[tenant['name']] = quota_list.__dict__['_info']
                collected_items[arg] = quotas
        return collected_items

    def data_collector(self):
        all_data = {'SRC': {}, 'DST': {}}
        param_dict = self.config.rollback_params['param_dict']
        for key in all_data.keys():
            for service in param_dict.keys():
                if service == 'Nova':
                    nova_data_list = \
                        self.nova_collector(key, param_dict[service])
                    all_data[key][service] = nova_data_list
                elif service == 'Keystone':
                    keystone_data_list = \
                        self.keystone_collector(key, param_dict[service])
                    all_data[key][service] = keystone_data_list
                elif service == 'Neutron':
                    neutron_data_list = \
                        self.neutron_collector(key, param_dict[service])
                    all_data[key][service] = neutron_data_list
                elif service == 'Cinder':
                    cinder_data_list = \
                        self.cinder_collector(key, param_dict[service])
                    all_data[key][service] = cinder_data_list
                elif service == 'Glance':
                    glance_data_list = \
                        self.glance_collector(key, param_dict[service])
                    all_data[key][service] = glance_data_list
        return all_data

    def dump_data(self, file_name=None):
        if not file_name:
            file_name = self.config.rollback_params['data_file_names']['PRE']
        path = 'devlab/tests'
        pre_file_path = os.path.join(self.main_folder, path, file_name)
        data = self.data_collector()
        with open(pre_file_path, "w") as f:
            yaml.dump(data, f, default_flow_style=False)
예제 #7
0
 def __init__(self, *args, **kwargs):
     super(FunctionalTest, self).__init__(*args, **kwargs)
     suppress_dependency_logging()
     self.src_cloud = Prerequisites(cloud_prefix='SRC', config=config)
     self.dst_cloud = Prerequisites(cloud_prefix='DST', config=config)
     self.filtering_utils = FilteringUtils()
예제 #8
0
class FunctionalTest(unittest.TestCase):
    def __init__(self, *args, **kwargs):
        super(FunctionalTest, self).__init__(*args, **kwargs)
        suppress_dependency_logging()
        self.src_cloud = Prerequisites(cloud_prefix='SRC', config=config)
        self.dst_cloud = Prerequisites(cloud_prefix='DST', config=config)
        self.filtering_utils = FilteringUtils()

    def filter_networks(self):
        networks = [i['name'] for i in config.networks]
        for i in config.tenants:
            if 'networks' in i:
                for j in i['networks']:
                    networks.append(j['name'])
        return self._get_neutron_resources('networks', networks)

    # TODO(raies): Currently we support filtering of those subnets which has
    # 'name' parameter in it's detail.
    # Implimentation of Subnet filtering for no name subnets is still needed.
    def filter_subnets(self):
        subnets = [i['name'] for i in config.subnets]
        for i in config.tenants:
            if 'subnets' in i:
                for subnet in i['subnets']:
                    subnets.append(subnet['name'])
        return self._get_neutron_resources('subnets', subnets)

    def filter_routers(self):
        routers = [i['router']['name'] for i in config.routers]
        return self._get_neutron_resources('routers', routers)

    def filter_floatingips(self):
        # Now we create floating ip, after tenant networks created.
        # Will be fixed with tests for floating ip associating
        def get_fips(_user):
            self.src_cloud.switch_user(user=_user['name'],
                                       tenant=_user['tenant'],
                                       password=_user['password'])
            _client = self.src_cloud.neutronclient
            return [_fip['floating_ip_address']
                    for _fip in _client.list_floatingips()['floatingips']]

        for tenant in config.tenants:
            fips = [fip for user in config.users
                    if tenant['name'] == user['tenant'] and user['enabled']
                    and not user.get('deleted')
                    for fip in get_fips(user)]
            return set(fips)

    def filter_users(self):
        users = []
        for user in config.users:
            if user.get('deleted'):
                continue
            if self._tenant_exists(user['tenant']) or\
                    self._user_has_not_primary_tenants(user['name']):
                users.append(user['name'])
        return self._get_keystone_resources('users', users)

    def filter_tenants(self):
        tenants = [i['name'] for i in config.tenants]
        return self._get_keystone_resources('tenants', tenants)

    def filter_roles(self):
        roles = [i['name'] for i in config.roles]
        return self._get_keystone_resources('roles', roles)

    def filter_vms(self):
        vms = config.vms
        [vms.extend(i['vms']) for i in config.tenants if 'vms' in i]
        vms_names = [vm['name'] for vm in vms]
        opts = {'search_opts': {'all_tenants': 1}}
        return [i for i in self.src_cloud.novaclient.servers.list(**opts)
                if i.name in vms_names]

    def filter_flavors(self):
        flavors = [i['name'] for i in config.flavors]
        return self._get_nova_resources('flavors', flavors)

    def filter_keypairs(self):
        keypairs = [i['name'] for i in config.keypairs]
        return self._get_nova_resources('keypairs', keypairs)

    def filter_security_groups(self):
        sgs = [sg['name'] for i in config.tenants if 'security_groups' in i
               for sg in i['security_groups']]
        return self._get_neutron_resources('security_groups', sgs)

    def filter_images(self):
        images = [i['name'] for i in config.images]
        for tenant in config.tenants:
            if not tenant.get('images'):
                continue
            [images.append(i['name']) for i in tenant['images']]
        return [i for i in self.src_cloud.glanceclient.images.list()
                if i.name in images]

    def filter_volumes(self):
        volumes = [i['name'] for i in config.cinder_volumes]
        opts = {'search_opts': {'all_tenants': 1}}
        return [i for i in self.src_cloud.cinderclient.volumes.list(**opts)
                if i.display_name in volumes]

    def _get_neutron_resources(self, res, names):
        _list = getattr(self.src_cloud.neutronclient, 'list_' + res)()
        return {res: [i for i in _list[res] if i['name'] in names]}

    def _get_nova_resources(self, res, names):
        client = getattr(self.src_cloud.novaclient, res)
        return [i for i in client.list()
                if i.name in names]

    def _get_keystone_resources(self, res, names):
        client = getattr(self.src_cloud.keystoneclient, res)
        return [i for i in client.list()
                if i.name in names]

    def _tenant_exists(self, tenant_name):
        try:
            self.src_cloud.get_tenant_id(tenant_name)
            return True
        except IndexError:
            return False

    def _user_has_not_primary_tenants(self, user_name):
        user_id = self.src_cloud.get_user_id(user_name)
        for tenant in self.src_cloud.keystoneclient.tenants.list():
            if self.src_cloud.keystoneclient.roles.roles_for_user(
                    user=user_id, tenant=tenant.id):
                return True
        return False

    def get_vms_with_fip_associated(self):
        vms = config.vms
        [vms.extend(i['vms']) for i in config.tenants if 'vms' in i]
        return [vm['name'] for vm in vms if vm.get('fip')]
예제 #9
0
 def chose_destination_cloud(self, destination):
     self.cloud_info = Prerequisites(cloud_prefix=destination, config=self.config)
예제 #10
0
class DataCollector(object):
    """
    Class to collect data for existing objects on both clusters. As a result
    returns __dict__ with info for both SRC and DST clusters.
    Methods description:
        - unified_method: method to get resources for each tenant separately in
                          case the resource is specific for each tenant,
                          example key-pairs, security-groups, etc.
        - nova_collector: method to get nova resources, list of resources can
                          be obtained in config.py:
                            config.rollback_params['param_dict']['Nova']
        - cinder_collector: method to get cinder resources, list of resources
                            can be obtained in config.py:
                              config.rollback_params['param_dict']['Cinder']
        - glance_collector: method to get glance resources, list of resources
                            can be obtained in config.py:
                              config.rollback_params['param_dict']['Glance']
        - neutron_collector: method to get neutron resources, list of resources
                             can be obtained in config.py:
                               config.rollback_params['param_dict']['Neutron']
        - keystone_collector: method to get keystone resources, list of
                              resources can be obtained in config.py:
                              config.rollback_params['param_dict']['Keystone']
    """

    def __init__(self, config):
        self.cloud_info = None
        self.migration_utils = FilteringUtils()
        self.main_folder = self.migration_utils.main_folder
        self.config = config

    def chose_destination_cloud(self, destination):
        self.cloud_info = Prerequisites(cloud_prefix=destination, config=self.config)

    def return_to_admin_privileges(self):
        self.cloud_info.switch_user(
            user=self.cloud_info.username, password=self.cloud_info.password, tenant=self.cloud_info.tenant
        )

    def form_client_method(self, *arguments):
        client = self.cloud_info
        for argument in arguments:
            client = getattr(client, argument)
        return client()

    def unified_method(self, destination, collected_items, _res, *args):
        main_dict = {}
        if destination == "SRC":
            for user, key_pair in zip(self.config.users, self.config.keypairs):
                self.cloud_info.switch_user(user=user["name"], password=user["password"], tenant=user["tenant"])
                names_list = self.form_client_method(*args)
                instance_list = []
                for instance in names_list:
                    instance_list.append(instance.__dict__["_info"])
                main_dict[user["tenant"]] = instance_list
            self.return_to_admin_privileges()
            names_list = self.form_client_method(*args)
            instance_list = []
            for instance in names_list:
                instance_list.append(instance.__dict__["_info"])
            main_dict["admin"] = instance_list
            collected_items[_res] = main_dict
        elif destination == "DST":
            names_list = self.form_client_method(*args)
            instance_list = []
            for instance in names_list:
                instance_list.append(instance.__dict__["_info"])
            collected_items[_res] = instance_list

    def nova_collector(self, destination, *args):
        """
        Nova data collector method.
        """
        collected_items = {}
        self.chose_destination_cloud(destination)
        for arg in args[0]:
            if arg == "servers":
                vm_list = []
                servers_list = self.cloud_info.novaclient.servers.list(search_opts={"all_tenants": 1})
                for server in servers_list:
                    vm = server.__dict__["_info"]
                    for data in vm.keys():
                        if data == u"updated":
                            del vm[data]
                    vm_list.append(vm)
                collected_items[arg] = vm_list
            elif arg == "security_groups":
                self.unified_method(destination, collected_items, arg, "novaclient", arg, "list")
            elif arg == "flavors":
                flavor_list = []
                flavors = self.cloud_info.novaclient.flavors.list()
                for inst in flavors:
                    flavor = inst.__dict__
                    flavor_list.append(flavor["_info"])
                collected_items[arg] = flavor_list
            elif arg == "quotas":
                quotas = {}
                tenant_list = self.cloud_info.keystoneclient.tenants.list()
                for tenant in tenant_list:
                    tenant = tenant.__dict__
                    quota_list = self.cloud_info.novaclient.quotas.get(tenant["id"])
                    quotas[tenant["name"]] = quota_list.__dict__["_info"]
                collected_items[arg] = quotas
            elif arg == "keypairs":
                self.unified_method(destination, collected_items, arg, "novaclient", arg, "list")
        return collected_items

    def neutron_collector(self, destination, *args):
        """
        Neutron data collector method.
        """
        collected_items = {}
        self.chose_destination_cloud(destination)
        for arg in args[0]:
            if arg == "networks":
                networks_list = self.cloud_info.neutronclient.list_networks()
                collected_items["networks"] = networks_list["networks"]
            elif arg == "subnets":
                subnets_list = self.cloud_info.neutronclient.list_subnets()
                collected_items["subnets"] = subnets_list["subnets"]
            elif arg == "routers":
                routers_list = self.cloud_info.neutronclient.list_routers()
                collected_items["routers"] = routers_list["routers"]
            elif arg == "ports":
                ports_list = self.cloud_info.neutronclient.list_ports()
                collected_items["ports"] = ports_list["ports"]
            elif arg == "quotas":
                quotas = {}
                tenant_list = self.cloud_info.keystoneclient.tenants.list()
                for tenant in tenant_list:
                    tenant = tenant.__dict__
                    quota_list = self.cloud_info.neutronclient.show_quota(tenant["id"])
                    quotas[tenant["name"]] = quota_list
                collected_items[arg] = quotas
        return collected_items

    def keystone_collector(self, destination, *args):
        """
        Keystone data collector method.
        """

        def optimizer(resource_list):
            final_list = []
            for resource in resource_list:
                final_list.append(resource.__dict__["_info"])
            return final_list

        collected_items = {}
        self.chose_destination_cloud(destination)
        for arg in args[0]:
            if arg == "users":
                user_list = self.cloud_info.keystoneclient.users.list()
                data_list = optimizer(user_list)
                collected_items[arg] = data_list
            elif arg == "tenants":
                tenant_list = self.cloud_info.keystoneclient.tenants.list()
                data_list = optimizer(tenant_list)
                collected_items[arg] = data_list
            elif arg == "roles":
                role_list = self.cloud_info.keystoneclient.roles.list()
                data_list = optimizer(role_list)
                collected_items[arg] = data_list
        return collected_items

    def glance_collector(self, destination, *args):
        """
        Glance data collector method.
        """
        collected_items = {}
        self.chose_destination_cloud(destination)
        for arg in args[0]:
            if arg == "images":
                image_list = [x.__dict__["_info"] for x in self.cloud_info.glanceclient.images.list()]
                collected_items[arg] = image_list
            elif arg == "members":
                members = {}
                image_list = [x.__dict__ for x in self.cloud_info.glanceclient.images.list()]
                for image in image_list:
                    member_list = self.cloud_info.glanceclient.image_members.list(image["id"])
                    final_list = []
                    for member in member_list:
                        final_list.append(member.__dict__["_info"])
                    members[image["name"]] = final_list
                collected_items[arg] = members

        return collected_items

    def cinder_collector(self, destination, *args):
        """
        Cinder data collector method.
        """
        collected_items = {}
        self.chose_destination_cloud(destination)
        for arg in args[0]:
            if arg == "volumes":
                self.unified_method(destination, collected_items, arg, "cinderclient", arg, "list")
            elif arg == "volume_snapshots":
                self.unified_method(destination, collected_items, arg, "cinderclient", arg, "list")
            elif arg == "quotas":
                quotas = {}
                tenant_list = self.cloud_info.keystoneclient.tenants.list()
                for tenant in tenant_list:
                    tenant = tenant.__dict__
                    quota_list = self.cloud_info.cinderclient.quotas.get(tenant["id"])
                    quotas[tenant["name"]] = quota_list.__dict__["_info"]
                collected_items[arg] = quotas
        return collected_items

    def data_collector(self):
        all_data = {"SRC": {}, "DST": {}}
        param_dict = self.config.rollback_params["param_dict"]
        for key in all_data.keys():
            for service in param_dict.keys():
                if service == "Nova":
                    nova_data_list = self.nova_collector(key, param_dict[service])
                    all_data[key][service] = nova_data_list
                elif service == "Keystone":
                    keystone_data_list = self.keystone_collector(key, param_dict[service])
                    all_data[key][service] = keystone_data_list
                elif service == "Neutron":
                    neutron_data_list = self.neutron_collector(key, param_dict[service])
                    all_data[key][service] = neutron_data_list
                elif service == "Cinder":
                    cinder_data_list = self.cinder_collector(key, param_dict[service])
                    all_data[key][service] = cinder_data_list
                elif service == "Glance":
                    glance_data_list = self.glance_collector(key, param_dict[service])
                    all_data[key][service] = glance_data_list
        return all_data

    def dump_data(self, file_name=None):
        if not file_name:
            file_name = self.config.rollback_params["data_file_names"]["PRE"]
        path = "devlab/tests"
        pre_file_path = os.path.join(self.main_folder, path, file_name)
        data = self.data_collector()
        with open(pre_file_path, "w") as f:
            yaml.dump(data, f, default_flow_style=False)
예제 #11
0
class FunctionalTest(unittest.TestCase):
    def __init__(self, *args, **kwargs):
        super(FunctionalTest, self).__init__(*args, **kwargs)
        suppress_dependency_logging()

        if not config_ini:
            raise ConfFileError('Configuration file parameter'
                                ' --tc-file is missing or '
                                'the file has wrong format')

        self.src_cloud = Prerequisites(cloud_prefix='SRC',
                                       configuration_ini=config_ini,
                                       config=config)
        self.dst_cloud = Prerequisites(cloud_prefix='DST',
                                       configuration_ini=config_ini,
                                       config=config)
        self.filtering_utils = utils.FilteringUtils()
        self.migration_utils = utils.MigrationUtils(config)

    def filter_networks(self):
        networks = [i['name'] for i in config.networks]
        for i in config.tenants:
            if 'networks' in i and not i.get('deleted'):
                for j in i['networks']:
                    networks.append(j['name'])
        return self._get_neutron_resources('networks', networks)

    def filter_subnets(self):
        subnets = []
        admin_tenant_id = self.src_cloud.get_tenant_id(self.src_cloud.tenant)
        for net in config.networks:
            if not net.get('subnets'):
                continue
            for subnet in net['subnets']:
                subnet['tenant_id'] = admin_tenant_id
                subnets.append(subnet)
        subnets = [i for net in config.networks if net.get('subnets')
                   for i in net['subnets']]
        for tenant in config.tenants:
            if 'networks' not in tenant or tenant.get('deleted'):
                continue
            for network in tenant['networks']:
                if 'subnets' not in network:
                    continue
                for subnet in network['subnets']:
                    subnet['tenant_id'] = self.src_cloud.get_tenant_id(
                        tenant['name'])
                    subnets.append(subnet)
        env_subnets = self.src_cloud.neutronclient.list_subnets()['subnets']
        filtered_subnets = {'subnets': []}
        for env_subnet in env_subnets:
            for subnet in subnets:
                same_cidr = env_subnet['cidr'] == subnet['cidr']
                same_tenant = env_subnet['tenant_id'] == subnet['tenant_id']
                if same_cidr and same_tenant:
                    filtered_subnets['subnets'].append(env_subnet)
        return filtered_subnets

    def filter_routers(self):
        routers = [i['router']['name'] for i in config.routers]
        return self._get_neutron_resources('routers', routers)

    def filter_floatingips(self):
        # Now we create floating ip, after tenant networks created.
        # Will be fixed with tests for floating ip associating
        def get_fips(_user):
            self.src_cloud.switch_user(user=_user['name'],
                                       tenant=_user['tenant'],
                                       password=_user['password'])
            _client = self.src_cloud.neutronclient
            return [_fip['floating_ip_address']
                    for _fip in _client.list_floatingips()['floatingips']]

        for tenant in config.tenants:
            fips = [fip for user in config.users
                    if tenant['name'] == user.get('tenant') and user['enabled']
                    and not user.get('deleted')
                    for fip in get_fips(user)]
            return set(fips)

    def filter_users(self):
        users = []
        for user in config.users:
            if user.get('deleted'):
                continue
            if self.src_cloud.tenant_exists(user.get('tenant')) or\
                    self.src_cloud.user_has_not_primary_tenants(user['name']):
                users.append(user['name'])
        return self._get_keystone_resources('users', users)

    def filter_tenants(self):
        tenants = [i['name'] for i in config.tenants]
        return self._get_keystone_resources('tenants', tenants)

    def filter_roles(self):
        roles = [i['name'] for i in config.roles]
        return self._get_keystone_resources('roles', roles)

    def filter_vms(self):
        vms = self.migration_utils.get_all_vms_from_config()
        vms_names = [vm['name'] for vm in vms if not vm.get('broken')]
        opts = {'search_opts': {'all_tenants': 1}}
        return [i for i in self.src_cloud.novaclient.servers.list(**opts)
                if i.name in vms_names]

    def filter_flavors(self, filter_only_private=False):
        flavors = []
        if filter_only_private:
            nova_args = {'is_public': None}
        else:
            nova_args = None
        all_flavors = config.flavors
        for tenant in config.tenants:
            if tenant.get('flavors'):
                all_flavors += [flavor for flavor in tenant['flavors']]
        for flavor in all_flavors:
            if filter_only_private:
                if flavor.get('is_public') == False:
                    flavors.append(flavor['name'])
            elif 'is_public' not in flavor or flavor.get('is_public'):
                flavors.append(flavor['name'])
        return self._get_nova_resources('flavors', flavors, nova_args)

    def filter_keypairs(self):
        return self.src_cloud.get_users_keypairs()

    def filter_security_groups(self):
        sgs = [sg['name'] for i in config.tenants if 'security_groups' in i
               for sg in i['security_groups']]
        return self._get_neutron_resources('security_groups', sgs)

    def filter_images(self):
        all_images = self.migration_utils.get_all_images_from_config()
        images = [i['name'] for i in all_images if not i.get('broken')]
        return [i for i in self.src_cloud.glanceclient.images.list()
                if i.name in images]

    def filter_volumes(self):
        volumes = config.cinder_volumes
        [volumes.extend(i['cinder_volumes']) for i in config.tenants
         if 'cinder_volumes' in i and not i.get('deleted')]
        volumes.extend(config.cinder_volumes_from_images)
        volumes_names = [volume['display_name'] for volume in volumes]
        opts = {'search_opts': {'all_tenants': 1}}
        return [i for i in self.src_cloud.cinderclient.volumes.list(**opts)
                if i.display_name in volumes_names]

    def _get_neutron_resources(self, res, names):
        _list = getattr(self.src_cloud.neutronclient, 'list_' + res)()
        return {res: [i for i in _list[res] if i['name'] in names]}

    def _get_nova_resources(self, res, names, args=None):
        client = getattr(self.src_cloud.novaclient, res)
        if args:
            return [i for i in client.list(**args) if i.name in names]
        else:
            return [i for i in client.list() if i.name in names]

    def _get_keystone_resources(self, res, names):
        client = getattr(self.src_cloud.keystoneclient, res)
        return [i for i in client.list()
                if i.name in names]

    def get_vms_with_fip_associated(self):
        vms = config.vms
        [vms.extend(i['vms']) for i in config.tenants if 'vms' in i]
        return [vm['name'] for vm in vms if vm.get('fip')]

    def tenant_exists(self, keystone_client, tenant_id):
        try:
            keystone_client.get(tenant_id)
        except ks_exceptions.NotFound:
            return False
        return True