def change_group(self, group_name): """ From the settings menu change to the group specified by 'group_name' Only available in versions >= 5.9 User is required to be currently logged in """ if not self.logged_in_as_user: raise CFMEException("Unable to change group when a user is not logged in") if group_name not in self.group_names: raise CFMEException("{} is not an assigned group for {}".format( group_name, self.current_username)) self.settings.groups.select_item(group_name) return True
def wait_for_vm_state_changes(vm, timeout=600): count = 0 while count < timeout: try: quadicon = vm.find_quadicon(refresh=True, from_any_provider=True) logger.info("Quadicon state for %s is %s", vm.name, repr(quadicon.state)) if "archived" in quadicon.state.lower(): return True elif "orphaned" in quadicon.state.lower(): raise CFMEException("VM should be Archived but it is Orphaned now.") except Exception as e: logger.exception(e) pass time.sleep(15) count += 15 if count > timeout: raise CFMEException("VM should be Archived but it is Orphaned now.")
def edit_tags(self, tag, value): """Edit the tags of a particular stack""" view = navigate_to(self, 'EditTags') view.form.fill({'select_tag': tag, 'select_value': value}) view.form.save_button.click() detail_view = self.create_view(StackDetailsView) detail_view.entities.flash.assert_success_message('Tag edits were successfully saved') company_tag = self.get_tags() if company_tag != "{}: {}".format(tag.replace(" *", ""), value): raise CFMEException("{} ({}) tag is not assigned!".format(tag.replace(" *", ""), value))
def edit_tags(self, tag, value): navigate_to(self, 'EditTags') fill(edit_tags_form, { 'select_tag': tag, 'select_value': value }, action=form_buttons.save) flash.assert_success_message('Tag edits were successfully saved') company_tag = self.get_tags() if company_tag != "{}: {}".format(tag.replace(" *", ""), value): raise CFMEException("{} ({}) tag is not assigned!".format( tag.replace(" *", ""), value))
def create_rest(self, vm_name, provider, form_values=None, check_existing=False): """Provisions a VM/Instance with the default self.vm_default_args_rest. self.vm_default_args_rest may be overridden by form_values. For more details about rest attributes please check: https://access.redhat.com/documentation/en-us/red_hat_cloudforms/4.6/html-single/ red_hat_cloudforms_rest_api/index#provision-request-supported-attributes or http://manageiq.org/docs/reference/fine/api/appendices/provision_attributes NOTE: placement_auto defaults to True for requests made from the API or CloudForms Automate. Args: vm_name: vm name provider: provider object form_values: overrides default provision arguments or extends it. check_existing: cancel creation if VM exists Return: Instance object """ vm = self.instantiate(vm_name, provider) if check_existing and vm.exists: return vm else: if not provider.is_refreshed(): provider.refresh_provider_relationships() wait_for(provider.is_refreshed, func_kwargs={'refresh_delta': 10}, timeout=600) if not form_values: form_values = vm.vm_default_args_rest else: inst_args = vm.vm_default_args_rest form_values = recursive_update(inst_args, form_values) response = self.appliance.rest_api.collections.provision_requests.action.create( **form_values)[0] assert_response(self.appliance) provision_request = vm.appliance.collections.requests.instantiate( description=response.description) provision_request.wait_for_request(num_sec=900) if provision_request.is_succeeded(): wait_for(lambda: provider.mgmt.does_vm_exist(vm.name), num_sec=1000, delay=5, message="VM {} becomes visible".format(vm.name)) else: logger.error("Provisioning failed with the message {}".format( provision_request.rest.message)) raise CFMEException(provision_request.rest.message) return vm
def _get_vm_name(request): """Helper function to get vm name from test requirement mark. At first we try to get a requirement value from ``pytestmark`` module list. If it's missing we can try to look up it in the test function itself. There is one restriction for it. We cannot get the test function mark from module scoped fixtures. """ try: req = [ mark.args[0] for mark in request.module.pytestmark if mark.name == "requirement" ] except AttributeError: req = None logger.debug("Could not get the requirement from pytestmark") if not req and request.scope == "function": try: req = [ mark.args for mark in request.function.pytestmark if mark.name == 'requirement' ][0] except AttributeError: raise CFMEException("VM name can not be obtained") vm_name = random_vm_name(req[0]) if not request.config.getoption('--no-assignee-vm-name'): if isinstance(request.node, pytest.Function): assignee = get_parsed_docstring( request.node, request.session._docstrings_cache).get('assignee', '') else: # Fetch list of tests in the module object test_list = [ item for item in dir(request.module) if item.startswith('test_') and not ('test_requirements' == item) ] # Find out assignee for each test in test_list assignee_list = list() for test in test_list: nodeid = f'{request.node.fspath.strpath}::{test}' try: assignee_list.append( request.session._docstrings_cache[nodeid]['assignee']) except KeyError: continue # If all tests have same assignee, set length will be 1, else set assignee='module' assignee = assignee_list[0] if len( set(assignee_list)) == 1 else 'module' vm_name = f'{vm_name}-{assignee}' return vm_name
def current_groupname(self): current_groups = self.settings.groups.items # User is only assigned to one group if len(current_groups) == 1: return current_groups[0] for group in current_groups: if self.settings.groups.SELECTED_GROUP_MARKER in group: return group.replace(self.settings.groups.SELECTED_GROUP_MARKER, '') else: # Handle some weird case where we don't detect a current group raise CFMEException("User is not currently assigned to a group")
def edit_tags(self, tag, value): sel.force_navigate('clouds_stack', context={'stack': self}) pol_btn('Edit Tags', invokes_alert=True) fill(edit_tags_form, { 'select_tag': tag, 'select_value': value }, action=form_buttons.save) flash.assert_success_message('Tag edits were successfully saved') company_tag = self.get_tags() if company_tag != "{}: {}".format(tag.replace(" *", ""), value): raise CFMEException("{} ({}) tag is not assigned!".format( tag.replace(" *", ""), value))
def create( self, text, hover, type, image="fa-user", display=None, icon_color=None, assign_buttons=None, ): self.type = type view = navigate_to(self, "Add") changed = view.fill({ "text": text, "hover": hover, "image": image, "display": display, "icon_color": icon_color, "assign_buttons": assign_buttons, }) if not changed: # the form wasn't filled with anything # no button group to instantiate, nothing was created return None try: # add button slow to enable? wait_for(lambda: not view.add_button.disabled, timeout=5, handle_exception=True) except TimedOutError: logger.exception( 'Timed out waiting for add button on button group form') raise CFMEException( 'Custom button group add form button did not activate') view.add_button.click() view = self.create_view(ButtonGroupObjectTypeView) view.flash.assert_no_error() view.flash.assert_success_message( 'Button Group "{}" was added'.format(hover)) return self.instantiate( text=text, hover=hover, type=type, image=image, display=display, icon_color=icon_color, assign_buttons=assign_buttons, )
def _get_vm_name(request): """Helper function to get vm name from test requirement mark. At first we try to get a requirement value from ``pytestmark`` module list. If it's missing we can try to look up it in the test function itself. There is one restriction for it. We cannot get the test function mark from module scoped fixtures. """ req = [mark.args[0] for mark in request.module.pytestmark if mark.name == "requirement"] if not req and request.scope == "function": try: req = request.function.requirement.args except AttributeError: raise CFMEException("VM name can not be obtained") return random_vm_name(req[0])
def get_appliance(provider): '''Fixture to provision appliance to the provider being tested if necessary''' global appliance_list, main_provider appliance_vm_prefix = "long-test_ssa-appl_" if provider.key not in appliance_list: try: # see if the current appliance is on the needed provider ip_addr = urlparse(store.base_url).hostname appl_name = provider.mgmt.get_vm_name_from_ip(ip_addr) logger.info( "re-using already provisioned appliance on {}...".format( provider.key)) main_provider = provider.key appliance = Appliance(provider.key, appl_name) appliance.configure_fleecing() appliance_list[provider.key] = appliance except Exception as e: logger.exception(e) # provision appliance and configure ver_to_prov = str(version.current_version()) logger.info("provisioning {} appliance on {}...".format( ver_to_prov, provider.key)) appliance = None try: appliance = provision_appliance( vm_name_prefix=appliance_vm_prefix, version=ver_to_prov, provider_name=provider.key) logger.info("appliance IP address: " + str(appliance.address)) appliance.configure(setup_fleece=True) except Exception as e: logger.exception(e) if appliance is not None: appliance.destroy() raise CFMEException( 'Appliance encountered error during initial setup: {}'. format(str(e))) appliance_list[provider.key] = appliance return appliance_list[provider.key]
def create( self, text, hover, type="Default", image="fa-user", icon_color="#000000", display=True, group=None, dialog=None, display_for=None, submit=None, playbook_cat_item=None, inventory=None, hosts=None, open_url=None, system=None, request=None, attributes=None, visibility=None, enablement=None, roles=None, ): self.group = group or self.parent view = navigate_to(self, "Add") view.options.fill({"type": type}) view.fill({ "options": { "text": text, "display": display, "hover": hover, "image": image, "icon_color": icon_color, "open_url": open_url, "display_for": display_for, "submit": submit, "form": { "dialog": dialog, "playbook_cat_item": playbook_cat_item, "inventory": inventory, "hosts": hosts, }, } }) if visibility: # TODO: extend visibility expression variations if needed. if self.group.type in EVM_TAG_OBJS: tag = "EVM {obj_type}.{tag}".format(obj_type=self.group.type, tag=visibility["tag"]) elif self.group.type in BUILD_TAG_OBJS: _type = "Switch" if self.group.type == "Virtual Infra Switch" else self.group.type tag = "{obj_type}.Build.{tag}".format(obj_type=_type, tag=visibility["tag"]) else: tag = "{obj_type}.{tag}".format(obj_type=self.group.type, tag=visibility["tag"]) if view.advanced.visibility.define_exp.is_displayed: view.advanced.visibility.define_exp.click() view.advanced.visibility.expression.fill_tag( tag=tag, value=visibility["value"]) if enablement: # TODO: extend enablement expression variations if needed. if self.group.type in EVM_TAG_OBJS: tag = "EVM {obj_type}.{tag}".format(obj_type=self.group.type, tag=enablement["tag"]) elif self.group.type in BUILD_TAG_OBJS: _type = "Switch" if self.group.type == "Virtual Infra Switch" else self.group.type tag = "{obj_type}.Build.{tag}".format(obj_type=_type, tag=enablement["tag"]) else: tag = "{obj_type}.{tag}".format(obj_type=self.group.type, tag=enablement["tag"]) if view.advanced.enablement.define_exp.is_displayed: view.advanced.enablement.define_exp.click() view.advanced.enablement.expression.fill_tag( tag=tag, value=enablement["value"]) view.advanced.enablement.disabled_text.fill("Tag - {} : {}".format( enablement["tag"], enablement["value"])) view.fill({"advanced": {"system": system, "request": request}}) if attributes: view.advanced.attributes.fill(attributes) if roles: view.advanced.role_show.fill("<By Role>") view.advanced.roles.wait_displayed("20s") view.advanced.roles.fill(roles) else: view.advanced.role_show.fill("<To All>") try: # add button slow to enable? wait_for(lambda: not view.add_button.disabled, timeout=5, handle_exception=True) except TimedOutError: logger.exception( 'Timed out waiting for add button on button group form') raise CFMEException( 'Custom button group add form button did not activate') view.add_button.click() view.flash.assert_no_error() return self.instantiate( self.group, text=text, hover=hover, type=type, display=display, dialog=dialog, display_for=display_for, submit=submit, playbook_cat_item=playbook_cat_item, inventory=inventory, hosts=hosts, image=image, icon_color=icon_color, open_url=open_url, system=system, request=request, attributes=attributes, visibility=visibility, enablement=enablement, roles=roles, )