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 __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()
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")]
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')]
def chose_destination_cloud(self, destination): self.cloud_info = Prerequisites(cloud_prefix=destination, config=self.config)
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)
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()
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')]
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)
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