Example #1
0
    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
Example #2
0
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.")
Example #3
0
 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))
Example #4
0
 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))
Example #5
0
    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
Example #6
0
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
Example #7
0
    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")
Example #8
0
 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))
Example #9
0
    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,
        )
Example #10
0
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])
Example #11
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]
Example #12
0
    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,
        )