def test_pre_scenario_preclient_package_installation(self): """Create product and repo from which the package will be installed post upgrade :id: preupgrade-eedab638-fdc9-41fa-bc81-75dd2790f7be :steps: 1. Create a content host with existing client ak 2. Create and sync repo from which the package will be installed on content host 3. Add repo to CV and then in Activation key :expectedresults: 1. The content host is created 2. The new repo and its product has been added to ak using which the content host is created """ prior_env = entities.LifecycleEnvironment( organization=self.org ).search(query={'search': 'name=Library'})[0] environment = entities.LifecycleEnvironment( organization=self.org, prior=prior_env.id, label=self.le_lable, name=self.le_name ).create() ak = create_activation_key_for_client_registration( ak_name=self.ak_name, client_os='rhel7', org=self.org, environment=environment, sat_state='pre' ) rhel7_client = dockerize( ak_name=ak.name, distro='rhel7', org_label=self.org.label) client_container_id = rhel7_client.values()[0] client_name = rhel7_client.keys()[0] product, yum_repo = create_yum_test_repo( product_name=self.prod_name, repo_url=FAKE_REPO_ZOO3, org=self.org) update_product_subscription_in_ak( product=product, yum_repo=yum_repo, ak=ak, org=self.org) time.sleep(30) attach_subscription_to_host_from_satellite( self.org.id, product.name, str(client_name).lower()) # Refresh subscriptions on client execute( docker_execute_command, client_container_id, 'subscription-manager refresh', host=self.docker_vm ) # Run goferd on client as its docker container kwargs = {'async': True, 'host': self.docker_vm} execute( docker_execute_command, client_container_id, 'goferd -f', **kwargs ) create_dict( {self.__class__.__name__: rhel7_client} )
def test_post_scenario_postclient_package_installation(self): """Post-upgrade scenario that creates and installs the package on post-upgrade client remotely and then verifies if the package installed :id: postupgrade-1a881c07-595f-425f-aca9-df2337824a8e :steps: 1. Create a content host with existing client ak 2. Create and sync repo from which the package will be installed on content host 3. Add repo to CV and then in Activation key 4. Install package on a pre-upgrade client :expectedresults: 1. The content host is created 2. The new repo and its product has been added to ak using which the content host is created 3. The package is installed on post-upgrade client """ org = entities.Organization(name=self.org_name).create() prior_env = entities.LifecycleEnvironment(organization=org).search( query={'search': 'name=Library'} )[0] environment = entities.LifecycleEnvironment( organization=org, prior=prior_env.id, label=self.le_name, name=self.le_name ).create() ak = create_activation_key_for_client_registration( ak_name=self.ak_name, client_os='rhel7', org=org, environment=environment, sat_state='post' ) rhel7_client = dockerize( ak_name=ak.name, distro='rhel7', org_label=org.label) client_container_id = rhel7_client.values()[0] client_name = rhel7_client.keys()[0].lower() product, yum_repo = create_yum_test_repo( product_name=self.prod_name, repo_url=FAKE_REPO_ZOO3, org=org) update_product_subscription_in_ak( product=product, yum_repo=yum_repo, ak=ak, org=org) time.sleep(10) attach_subscription_to_host_from_satellite( org.id, product.name, client_name) # Refresh subscriptions on client execute( docker_execute_command, client_container_id, 'subscription-manager refresh', host=self.docker_vm ) # Run goferd on client as its docker container kwargs = {'async': True, 'host': self.docker_vm} execute( docker_execute_command, client_container_id, 'goferd -f', **kwargs ) # Holding on for 30 seconds wihle goferd starts time.sleep(30) client_id = entities.Host().search( query={'search': 'name={}'.format(client_name)} )[0].id entities.Host().install_content(data={ 'organization_id': org.id, 'included': {'ids': [client_id]}, 'content_type': 'package', 'content': [self.package_name], }) time.sleep(20) # Validate if that package is really installed installed_package = execute( docker_execute_command, client_container_id, 'rpm -q {}'.format(self.package_name), host=self.docker_vm )[self.docker_vm] self.assertIn(self.package_name, installed_package)
def sync_capsule_repos_to_upgrade(capsules): """This syncs capsule repo in Satellite server and also attaches the capsule repo subscription to each capsule :param list capsules: The list of capsule hostnames to which new capsule repo subscription will be attached Following environment variable affects this function: CAPSULE_URL The url for capsule repo from latest satellite compose. If not provided, capsule repo from Red Hat repositories will be enabled FROM_VERSION Current Satellite version - to differentiate default organization. e.g. '6.1', '6.0' TO_VERSION Upgradable Satellite version - To enable capsule repo e.g '6.1', '6.2' OS OS version to enable next version capsule repo e.g 'rhel7', 'rhel6' Personal Upgrade Env Vars: CAPSULE_AK The AK name used in capsule subscription Rhevm upgrade Env Vars: RHEV_CAPSULE_AK The AK name used in capsule subscription """ logger.info('Syncing latest capsule repos in Satellite ...') capsule_repo = os.environ.get('CAPSULE_URL') from_version = os.environ.get('FROM_VERSION') to_version = os.environ.get('TO_VERSION') os_ver = os.environ.get('OS')[-1] if to_version in ['6.4', '6.3']: tools_repo_url = os.environ.get('TOOLS_URL_RHEL7') activation_key = os.environ.get( 'CAPSULE_AK', os.environ.get('RHEV_CAPSULE_AK')) if activation_key is None: logger.warning( 'The AK name is not provided for Capsule upgrade! Aborting...') sys.exit(1) # Set hammer configuration set_hammer_config() cv_name, env_name = hammer_determine_cv_and_env_from_ak( activation_key, '1') # Fix dead pulp tasks if os_ver == '6': run('for i in pulp_resource_manager pulp_workers pulp_celerybeat; ' 'do service $i restart; done') # If custom capsule repo is not given then # enable capsule repo from Redhat Repositories product_name = 'capsule6_latest' if capsule_repo \ else 'Red Hat Satellite Capsule' repo_name = 'capsule6_latest_repo' if capsule_repo \ else 'Red Hat Satellite Capsule {0} (for RHEL {1} Server) ' \ '(RPMs)'.format(to_version, os_ver) try: if capsule_repo: # Check if the product of latest capsule repo is already created, # if not create one and attach the subscription to existing AK get_attribute_value(hammer( 'product list --organization-id 1'), product_name, 'name') # If keyError is not thrown as if the product is created already logger.info( 'The product for latest Capsule repo is already created!') logger.info('Attaching that product subscription to capsule ....') else: # In case of CDN Upgrade, the capsule repo has to be resynced # and needs to publich/promote those contents raise KeyError except KeyError: # If latest capsule repo is not created already(Fresh Upgrade), # So create new.... if to_version in ['6.4', '6.3']: ( rhscl_prd, rhscl_repo_name, rhscl_label, rh7server_prd, rh7server_repo_name, rh7server_label ) = sync_rh_repos_to_satellite() if tools_repo_url: capsule_tools = 'Capsule Tools Product' capsule_tools_repo = 'Capsule Tools Repo' hammer_product_create(capsule_tools, '1') time.sleep(2) hammer_repository_create( capsule_tools_repo, '1', capsule_tools, tools_repo_url) else: tools_prd = 'Red Hat Enterprise Linux Server' tools_repo = 'Red Hat Satellite Tools {0} ' \ '(for RHEL {1} Server) (RPMs)'.format(to_version, os_ver ) tools_label = 'rhel-{0}-server-satellite-tools-{1}-' \ 'rpms'.format(os_ver, to_version) hammer_repository_set_enable( tools_repo, tools_prd, '1', 'x86_64') time.sleep(5) hammer_repository_synchronize(capsule_tools_repo, '1', capsule_tools ) hammer_content_view_add_repository( cv_name, '1', rhscl_prd, rhscl_repo_name) hammer_content_view_add_repository( cv_name, '1', rh7server_prd, rh7server_repo_name) hammer_content_view_add_repository( cv_name, '1', capsule_tools, capsule_tools_repo) hammer_activation_key_content_override( activation_key, rhscl_label, '1', '1') hammer_activation_key_content_override( activation_key, rh7server_label, '1', '1') if tools_repo_url: hammer_activation_key_add_subscription( activation_key, '1', capsule_tools) else: hammer_activation_key_content_override( activation_key, tools_label, '1', '1') if capsule_repo: hammer_product_create(product_name, '1') time.sleep(2) hammer_repository_create( repo_name, '1', product_name, capsule_repo) else: hammer_repository_set_enable( repo_name, product_name, '1', 'x86_64') repo_name = repo_name.replace('(', '').replace(')', '') + ' x86_64' hammer_repository_synchronize(repo_name, '1', product_name) # Add repos to CV hammer_content_view_add_repository( cv_name, '1', product_name, repo_name) hammer_content_view_publish(cv_name, '1') # Promote cv lc_env_id = get_attribute_value( hammer('lifecycle-environment list --organization-id 1 ' '--name {}'.format(env_name)), env_name, 'id') cv_version_data = hammer( 'content-view version list --content-view {} ' '--organization-id 1'.format(cv_name)) latest_cv_ver = sorted([float(data['name'].split( '{} '.format(cv_name))[1]) for data in cv_version_data]).pop() cv_ver_id = get_attribute_value(cv_version_data, '{0} {1}'.format( cv_name, latest_cv_ver), 'id') hammer_content_view_promote_version( cv_name, cv_ver_id, lc_env_id, '1', False if from_version == '6.0' else True) if capsule_repo: hammer_activation_key_add_subscription( activation_key, '1', product_name) else: label = 'rhel-{0}-server-satellite-capsule-{1}-rpms'.format( os_ver, to_version) hammer_activation_key_content_override( activation_key, label, '1', '1') # Add this latest capsule repo to capsules to perform upgrade later # If downstream capsule, Update AK with latest capsule repo subscription if capsule_repo: for capsule in capsules: if from_version == '6.1': subscription_id = get_product_subscription_id( '1', product_name) execute( attach_subscription_to_host_from_content_host, subscription_id, host=capsule) else: attach_subscription_to_host_from_satellite( '1', product_name, capsule) else: # In upgrade to CDN capsule, the subscription will be already attached pass
def sync_tools_repos_to_upgrade(client_os, hosts): """This syncs tools repo in Satellite server and also attaches the new tools repo subscription onto each client :param string client_os: The client OS of which tools repo to be synced e.g: rhel6, rhel7 :param list hosts: The list of capsule hostnames to which new capsule repo subscription will be attached Following environment variable affects this function: TOOLS_URL_{client_os} The url of tools repo from latest satellite compose. FROM_VERSION Current Satellite version - to differentiate default organization. e.g. '6.1', '6.0' Personal Upgrade Env Vars: CLIENT_AK The ak_name attached to subscription of client Rhevm upgrade Env Vars: RHEV_CLIENT_AK The AK name used in client subscription """ client_os = client_os.upper() tools_repo_url = os.environ.get('TOOLS_URL_{}'.format(client_os)) if tools_repo_url is None: logger.warning('The Tools Repo URL for {} is not provided ' 'to perform Client Upgrade !'.format(client_os)) sys.exit(1) activation_key = os.environ.get( 'CLIENT_AK_{}'.format(client_os), os.environ.get('RHEV_CLIENT_AK_{}'.format(client_os)) ) if activation_key is None: logger.warning('The AK details are not provided for {0} Client ' 'upgrade!'.format(client_os)) sys.exit(1) # Set hammer configuration set_hammer_config() cv_name, env_name = hammer_determine_cv_and_env_from_ak( activation_key, '1') tools_product = 'tools6_latest_{}'.format(client_os) tools_repo = 'tools6_latest_repo_{}'.format(client_os) # adding sleeps in between to avoid race conditions time.sleep(20) hammer_product_create(tools_product, '1') time.sleep(10) hammer_repository_create(tools_repo, '1', tools_product, tools_repo_url) time.sleep(10) hammer_repository_synchronize(tools_repo, '1', tools_product) hammer_content_view_add_repository(cv_name, '1', tools_product, tools_repo) hammer_content_view_publish(cv_name, '1') # Promote cv lc_env_id = get_attribute_value( hammer('lifecycle-environment list --organization-id 1 ' '--name {}'.format(env_name)), env_name, 'id') cv_version_data = hammer( 'content-view version list --content-view {} ' '--organization-id 1'.format(cv_name)) latest_cv_ver = sorted([float(data['name'].split( '{} '.format(cv_name))[1]) for data in cv_version_data]).pop() cv_ver_id = get_attribute_value(cv_version_data, '{0} {1}'.format( cv_name, latest_cv_ver), 'id') hammer_content_view_promote_version(cv_name, cv_ver_id, lc_env_id, '1') # Add new product subscriptions to AK hammer_activation_key_add_subscription(activation_key, '1', tools_product) # Add this latest tools repo to hosts to upgrade for host in hosts: if os.environ.get('FROM_VERSION') in ['6.0', '6.1']: subscription_id = get_product_subscription_id('1', tools_product) # If not User Hosts then, attach sub to dockered clients if not all([ os.environ.get('CLIENT6_HOSTS'), os.environ.get('CLIENT7_HOSTS') ]): docker_vm = os.environ.get('DOCKER_VM') execute( attach_subscription_to_host_from_content_host, subscription_id, True, host, host=docker_vm) # Else, Attach subs to user hosts else: execute( attach_subscription_to_host_from_content_host, subscription_id, host=host) else: attach_subscription_to_host_from_satellite( '1', tools_product, host)
def sync_capsule_repos_to_upgrade(capsules): """This syncs capsule repo in Satellite server and also attaches the capsule repo subscription to each capsule :param list capsules: The list of capsule hostnames to which new capsule repo subscription will be attached Following environment variable affects this function: CAPSULE_URL The url for capsule repo from latest satellite compose. If not provided, capsule repo from Red Hat repositories will be enabled FROM_VERSION Current Satellite version - to differentiate default organization. e.g. '6.1', '6.0' TO_VERSION Upgradable Satellite version - To enable capsule repo e.g '6.1', '6.2' OS OS version to enable next version capsule repo e.g 'rhel7', 'rhel6' Personal Upgrade Env Vars: CAPSULE_AK The AK name used in capsule subscription Rhevm upgrade Env Vars: RHEV_CAPSULE_AK The AK name used in capsule subscription """ logger.info('Syncing latest capsule repos in Satellite ...') capsule_repo = os.environ.get('CAPSULE_URL') from_version = os.environ.get('FROM_VERSION') to_version = os.environ.get('TO_VERSION') os_ver = os.environ.get('OS')[-1] activation_key = os.environ.get( 'CAPSULE_AK', os.environ.get('RHEV_CAPSULE_AK')) if activation_key is None: logger.warning( 'The AK name is not provided for Capsule upgrade! Aborting...') sys.exit(1) # Set hammer configuration set_hammer_config() cv_name, env_name = hammer_determine_cv_and_env_from_ak( activation_key, '1') # If custom capsule repo is not given then # enable capsule repo from Redhat Repositories product_name = 'capsule6_latest' if capsule_repo \ else 'Red Hat Satellite Capsule' repo_name = 'capsule6_latest_repo' if capsule_repo \ else 'Red Hat Satellite Capsule {0} (for RHEL {1} Server) ' \ '(RPMs)'.format(to_version, os_ver) try: if capsule_repo: # Check if the product of latest capsule repo is already created, # if not create one and attach the subscription to existing AK get_attribute_value(hammer( 'product list --organization-id 1'), product_name, 'name') # If keyError is not thrown as if the product is created already logger.info( 'The product for latest Capsule repo is already created!') logger.info('Attaching that product subscription to capsule ....') else: # In case of CDN Upgrade, the capsule repo has to be resynced # and needs to publich/promote those contents raise KeyError except KeyError: # If latest capsule repo is not created already(Fresh Upgrade), # So create new.... if capsule_repo: hammer_product_create(product_name, '1') time.sleep(2) hammer_repository_create( repo_name, '1', product_name, capsule_repo) else: hammer_repository_set_enable( repo_name, product_name, '1', 'x86_64') repo_name = repo_name.replace('(', '').replace(')', '') + ' x86_64' hammer_repository_synchronize(repo_name, '1', product_name) # Add repos to CV hammer_content_view_add_repository( cv_name, '1', product_name, repo_name) hammer_content_view_publish(cv_name, '1') # Promote cv lc_env_id = get_attribute_value( hammer('lifecycle-environment list --organization-id 1 ' '--name {}'.format(env_name)), env_name, 'id') cv_version_data = hammer( 'content-view version list --content-view {} ' '--organization-id 1'.format(cv_name)) latest_cv_ver = sorted([float(data['name'].split( '{} '.format(cv_name))[1]) for data in cv_version_data]).pop() cv_ver_id = get_attribute_value(cv_version_data, '{0} {1}'.format( cv_name, latest_cv_ver), 'id') hammer_content_view_promote_version( cv_name, cv_ver_id, lc_env_id, '1', False if from_version == '6.0' else True) if capsule_repo: hammer_activation_key_add_subscription( activation_key, '1', product_name) else: label = 'rhel-{0}-server-satellite-capsule-{1}-rpms'.format( os_ver, to_version) hammer_activation_key_content_override( activation_key, label, '1', '1') # Add this latest capsule repo to capsules to perform upgrade later # If downstream capsule, Update AK with latest capsule repo subscription if capsule_repo: for capsule in capsules: if from_version == '6.1': subscription_id = get_product_subscription_id( '1', product_name) execute( attach_subscription_to_host_from_content_host, subscription_id, host=capsule) else: attach_subscription_to_host_from_satellite( '1', product_name, capsule) else: # In upgrade to CDN capsule, the subscription will be already attached pass
def sync_capsule_repos_to_upgrade(capsules): """This syncs capsule repo in Satellite server and also attaches the capsule repo subscription to each capsule :param list capsules: The list of capsule hostnames to which new capsule repo subscription will be attached Following environment variable affects this function: CAPSULE_URL The url for capsule repo from latest satellite compose. FROM_VERSION Current Satellite version - to differentiate default organization. e.g. '6.1', '6.0' Personal Upgrade Env Vars: CAPSULE_SUBSCRIPTION List of cv_name, environment, ak_name attached to subscription of capsule in defined sequence Rhevm upgrade Env Vars: RHEV_CAPSULE_CV The CV name used in capsule subscription RHEV_CAPSULE_ENVIRONMENT The environment name used in capsule subscription RHEV_CAPSULE_AK The AK name used in capsule subscription """ capsule_repo = os.environ.get('CAPSULE_URL') if capsule_repo is None: print('The Capsule repo URL is not provided ' 'to perform Capsule Upgrade in feature!') sys.exit(1) cv_name, env_name, ak_name = [ os.environ.get(env_var) for env_var in ('RHEV_CAPSULE_CV', 'RHEV_CAPSULE_ENVIRONMENT', 'RHEV_CAPSULE_AK') ] details = os.environ.get('CAPSULE_SUBSCRIPTION') if details is not None: cv_name, env_name, ak_name = [ item.strip() for item in details.split(',') ] elif not all([cv_name, env_name, ak_name]): print('Error! The CV, Env and AK details are not provided for Capsule' 'upgrade!') sys.exit(1) set_hammer_config() # Create product capsule hammer_product_create('capsule6_latest', '1') time.sleep(2) hammer_repository_create('capsule6_latest_repo', '1', 'capsule6_latest', capsule_repo) hammer_repository_synchronize('capsule6_latest_repo', '1', 'capsule6_latest') # Add repos to CV hammer_content_view_add_repository(cv_name, '1', 'capsule6_latest', 'capsule6_latest_repo') hammer_content_view_publish(cv_name, '1') # Promote cv lc_env_id = get_attribute_value( hammer('lifecycle-environment list --organization-id 1 ' '--name {}'.format(env_name)), env_name, 'id') cv_version_data = hammer('content-view version list --content-view {} ' '--organization-id 1'.format(cv_name)) latest_cv_ver = sorted([ float(data['name'].split('{} '.format(cv_name))[1]) for data in cv_version_data ]).pop() cv_ver_id = get_attribute_value(cv_version_data, '{0} {1}'.format(cv_name, latest_cv_ver), 'id') hammer_content_view_promote_version(cv_name, cv_ver_id, lc_env_id, '1') # Add new product subscriptions to AK hammer_activation_key_add_subscription(ak_name, '1', 'capsule6_latest') # Add this latest capsule repo to capsules to upgrade for capsule in capsules: if os.environ.get('FROM_VERSION') == '6.1': subscription_id = get_product_subscription_id( '1', 'capsule6_latest') execute(attach_subscription_to_host_from_content_host, subscription_id, host=capsule) else: attach_subscription_to_host_from_satellite('1', 'capsule6_latest', capsule)