class http_proxy(View):
     value = FilteredDropdown(id='compute_resource_http_proxy_id')
Exemple #2
0
class SmartVariableContent(View):
    ROOT = ParametrizedLocator('{@locator}')
    key = TextInput(locator=".//input[contains(@name, '[key]')]")
    description = TextInput(
        locator=".//textarea[contains(@name, '[description]')]")
    puppet_class = FilteredDropdown(id='variable_lookup_key_puppetclass_id')
    parameter_type = Select(locator=".//select[contains(@name, '[parameter_type]')]")
    default_value = TextInputHidden(
        locator=".//textarea[contains(@name, '[default_value]')]")
    hidden = Checkbox(locator=".//input[contains(@name, '[hidden_value]')]")

    def __init__(self, parent, locator, logger=None):
        View.__init__(self, parent, logger=logger)
        self.locator = locator

    @View.nested
    class optional_input_validators(View):
        expander = Text(
            ".//h2[contains(@data-target, '#optional_input_validators_')]")
        validator_type = Select(
            locator=".//select[contains(@name, '[validator_type]')]")
        validator_rule = TextInput(
            locator=".//input[contains(@name, '[validator_rule]')]")

        def __init__(self, parent, logger=None):
            View.__init__(self, parent, logger=logger)
            if 'collapsed' in self.browser.classes(self.expander):
                self.expander.click()
                self.browser.wait_for_element(
                    self.validator_type, visible=True)

    @View.nested
    class prioritize_attribute_order(View):
        order = TextInput(locator="//textarea[@id='order']")
        merge_overrides = Checkbox(
            locator=".//input[contains(@id, 'merge_overrides')]")
        merge_default = Checkbox(
            locator=".//input[contains(@id, 'merge_default')]")
        avoid_duplicates = Checkbox(
            locator=".//input[contains(@id, 'avoid_duplicates')]")

    @View.nested
    class matchers(View):
        table = SatTable(
            ".//table[contains(@class, 'white-header')]",
            column_widgets={
                'Attribute type': MatcherAttribute(),
                'Value': TextInputHidden(
                    locator=".//textarea[contains(@id, 'value')]"),
            }
        )
        add_new_matcher = Text(
            ".//a[contains(@data-original-title, 'add a new matcher')]")

        def fill(self, values):
            """Add and fill all matchers provided
            Example::

                [
                    {
                        'Attribute type':
                        {
                            'matcher_attribute_type': 'os',
                            'matcher_attribute_value': 'x86'
                        },
                        'Value': 'newvalue'
                    },
                    {
                        'Attribute type':
                        {
                            'matcher_attribute_type': 'fqdn',
                            'matcher_attribute_value': 'myhost.com'
                        },
                        'Value': 'newvalue2'
                    }
                ]

            """
            for matcher_value in values:
                self.add_new_matcher.click()
                self.table[-1].fill(matcher_value)
        class zone(View):
            load_zones = Text("//a[contains(@id,'test_connection_button')]")
            value = FilteredDropdown(id='s2id_compute_resource_zone')

            def before_fill(self, values=None):
                self.load_zones.click()
Exemple #4
0
class ComputeResourceLibvirtProfileStorageItem(GenericRemovableWidgetItem):
    """Libvirt Compute Resource profile "Storage" item widget"""
    storage_pool = FilteredDropdown(id="pool_name")
    size = TextInput(locator=".//input[contains(@id, 'capacity')]")
    storage_type = FilteredDropdown(id="format_type")
Exemple #5
0
class ComputeResourceVMwareProfileNetworkItem(GenericRemovableWidgetItem):
    """VMware Compute Resource Profile "Network interface" item widget"""
    nic_type = FilteredDropdown(id="type")
    network = FilteredDropdown(id="network")
Exemple #6
0
 class TypeSynced(View):
     synced_content = FilteredDropdown(
         id='host_group_kickstart_repository')
Exemple #7
0
 class primary(SatVerticalTab):
     parent_location = FilteredDropdown(id='location_parent_id')
     name = TextInput(id='location_name')
     description = TextInput(id='location_description')
Exemple #8
0
 class domain(SatTab):  # noqa
     dns_domain = TextInput(id='domain_name')
     full_name = TextInput(id='domain_fullname')
     dns_capsule = FilteredDropdown(id='domain_dns_id')
Exemple #9
0
 class capsules(SatTab):
     dhcp_capsule = FilteredDropdown(id='subnet_dhcp_id')
     tftp_capsule = FilteredDropdown(id='subnet_tftp_id')
     reverse_dns_capsule = FilteredDropdown(id='subnet_dns_id')
     discovery_capsule = FilteredDropdown(id='subnet_discovery_id')
Exemple #10
0
 class WeeklyPeriodForm(View):
     weekday = FilteredDropdown(id='s2id_policy_weekday')
Exemple #11
0
 class host(SatTab):
     name = TextInput(id='host_name')
     organization = FilteredDropdown(id='host_organization')
     location = FilteredDropdown(id='host_location')
     hostgroup = FilteredDropdown(id='host_hostgroup')
     deploy = FilteredDropdown(id='host_compute_resource')
     lce = FilteredDropdown(id='host_lifecycle_environment')
     content_view = FilteredDropdown(id='host_content_view')
     content_source = FilteredDropdown(id='s2id_content_source_id')
     puppet_environment = FilteredDropdown(id='host_environment')
     puppet_master = FilteredDropdown(id='host_puppet_proxy')
     puppet_ca = FilteredDropdown(id='host_puppet_ca_proxy')
     openscap_capsule = FilteredDropdown(id='host_openscap_proxy')
Exemple #12
0
 class MonthlyPeriodForm(View):
     day_of_month = FilteredDropdown(id='s2id_policy_day_of_month')
Exemple #13
0
class ResourceProviderEditView(BaseLoggedInView):
    name = TextInput(id='compute_resource_name')
    description = TextInput(id='compute_resource_description')
    submit = Text('//input[@name="commit"]')

    provider = FilteredDropdown(id='s2id_compute_resource_provider')
    provider_content = ConditionalSwitchableView(reference='provider')

    @provider_content.register('Docker')
    class DockerProviderForm(View):
        url = TextInput(id='compute_resource_url')
        user = TextInput(id='compute_resource_user')
        password = TextInput(id='compute_resource_password')
        email = TextInput(id='compute_resource_email')

    @provider_content.register('EC2')
    class EC2ProviderForm(View):
        http_proxy = TextInput(id='compute_resource_http_proxy_id')
        access_key = TextInput(id='compute_resource_user')
        secret_key = TextInput(id='compute_resource_password')
        load_regions = Text("//*[contains(@id,'test_connection_button')]")

        def after_fill(self, was_change):
            self.load_regions.click()

    @provider_content.register('Google')
    class GCEProviderForm(View):
        google_project_id = TextInput(id='compute_resource_project')
        client_email = TextInput(id='compute_resource_email')
        certificate_path = TextInput(id='compute_resource_key_path')
        load_zones = Text("//*[contains(@id,'test_connection_button')]")

    @provider_content.register('Libvirt')
    class LibvirtProviderForm(View):
        url = TextInput(id='compute_resource_url')
        display_type = Select(id='compute_resource_display_type')
        console_passwords = Checkbox(
            id='compute_resource_set_console_password')

    @provider_content.register('RHEL OpenStack Platform')
    class OpenStackProviderForm(View):
        url = TextInput(id='compute_resource_url')
        user = TextInput(id='compute_resource_user')
        password = TextInput(id='compute_resource_password')
        domain = TextInput(id='compute_resource_domain')

    @provider_content.register('Rackspace')
    class RackspaceProviderForm(View):
        url = TextInput(id='compute_resource_url')
        user = TextInput(id='compute_resource_user')
        api_key = TextInput(id='compute_resource_password')
        region = Select(id='compute_resource_region')

    @provider_content.register('VMware')
    class VMwareProviderForm(View):
        vcenter = TextInput(id='compute_resource_server')
        user = TextInput(id='compute_resource_user')
        password = TextInput(id='compute_resource_password')
        display_type = Select(id='compute_resource_display_type')
        vnc_console_passwords = Checkbox(
            id='compute_resource_set_console_password')
        enable_caching = Checkbox(id='compute_resource_caching_enabled')
        load_datacenters = Text("//*[contains(@id,'test_connection_button')]")

        def after_fill(self, was_change):
            self.load_datacenters.click()

    @provider_content.register('RHV')
    class RHVProviderForm(View):
        url = TextInput(id='compute_resource_url')
        user = TextInput(id='compute_resource_user')
        password = TextInput(id='compute_resource_password')
        api4 = Checkbox(id='compute_resource_use_v4')
        certification_authorities = TextInput(id='compute_resource_public_key')

        @View.nested
        class datacenter(View):
            load_datacenters = Text(
                "//a[contains(@id,'test_connection_button')]")
            value = FilteredDropdown(id='s2id_compute_resource_uuid')

            def before_fill(self, values=None):
                self.load_datacenters.click()

    @property
    def is_displayed(self):
        return self.browser.wait_for_element(self.name,
                                             exception=False) is not None
Exemple #14
0
        class zone(View):
            value = FilteredDropdown(id='s2id_compute_resource_zone')

            def before_fill(self, values=None):
                self.load_zones.click()
Exemple #15
0
 class network(SatTab):
     domain = FilteredDropdown(id='hostgroup_domain')
     ipv4_subnet = FilteredDropdown(id='hostgroup_subnet')
     ipv6_subnet = FilteredDropdown(id='hostgroup_subnet6')
     realm = FilteredDropdown(id='hostgroup_realm')
Exemple #16
0
class HostInterface(View):
    ROOT = ".//div[@id='interfaceModal']"
    title = Text(".//h4[contains(., 'Interface')]")
    submit = Text(".//button[contains(@onclick, 'save_interface_modal')]")
    interface_type = FilteredDropdown(id='_type')
    mac = TextInput(locator=".//input[contains(@id, '_mac')]")
    device_identifier = TextInput(
        locator=".//input[contains(@id, '_identifier')]")
    dns = TextInput(locator=".//input[contains(@id, '_name')]")
    domain = FilteredDropdown(id='_domain_id')
    subnet = FilteredDropdown(id='_subnet_id')
    subnet_v6 = FilteredDropdown(id='_subnet6_id')
    ip = TextInput(locator=".//input[contains(@id, '_ip')]")
    ipv6 = TextInput(locator=".//input[contains(@id, '_ip6')]")
    managed = Checkbox(locator=".//input[contains(@id, '_managed')]")
    primary = CheckboxWithAlert(locator=".//input[contains(@id, '_primary')]")
    provision = CheckboxWithAlert(
        locator=".//input[contains(@id, '_provision')]")
    remote_execution = Checkbox(
        locator=".//input[contains(@id, '_execution')]")
    # when interface type is selected, some additional controls will appear on
    # the page
    interface_additional_data = ConditionalSwitchableView(
        reference='interface_type')

    @interface_additional_data.register('Interface')
    class InterfaceForm(View):
        virtual_nic = Checkbox(locator=".//input[contains(@id, '_virtual')]")
        virtual_attributes = ConditionalSwitchableView(reference='virtual_nic')

        @virtual_attributes.register(True, default=True)
        class VirtualAttributesForm(View):
            tag = TextInput(locator=".//input[contains(@id, '_tag')]")
            attached_to = TextInput(
                locator=".//input[contains(@id, '_attached_to')]")

    @interface_additional_data.register('BMC')
    class BMCForm(View):
        username = TextInput(locator=".//input[contains(@id, '_username')]")
        password = TextInput(locator=".//input[contains(@id, '_password')]")
        provider = FilteredDropdown(id='_provider')

    @interface_additional_data.register('Bond')
    class BondForm(View):
        mode = FilteredDropdown(id='_mode')
        attached_devices = TextInput(
            locator=".//input[contains(@id, '_attached_devices')]")
        bond_options = TextInput(
            locator=".//input[contains(@id, '_bond_options')]")

    @interface_additional_data.register('Bridge')
    class BridgeForm(View):
        attached_devices = TextInput(
            locator=".//input[contains(@id, '_attached_devices')]")

    # Compute resource attributes
    network_type = FilteredDropdown(id='_compute_attributes_type')
    network = FilteredDropdown(id='_compute_attributes_bridge')
    nic_type = FilteredDropdown(id='_compute_attributes_model')

    def after_fill(self, was_change):
        """Submit the dialog data once all necessary view widgets filled"""
        self.submit.click()
        wait_for(lambda: self.submit.is_displayed is False,
                 timeout=300,
                 delay=1,
                 logger=self.logger)

    @property
    def is_displayed(self):
        return self.browser.wait_for_element(self.title,
                                             visible=True,
                                             exception=False) is not None
Exemple #17
0
 class TypeMedium(View):
     media = FilteredDropdown(id='hostgroup_medium')
Exemple #18
0
 class BMCForm(View):
     username = TextInput(locator=".//input[contains(@id, '_username')]")
     password = TextInput(locator=".//input[contains(@id, '_password')]")
     provider = FilteredDropdown(id='_provider')
Exemple #19
0
class VirtwhoConfigureCreateView(BaseLoggedInView):
    breadcrumb = BreadCrumb()
    name = TextInput(id='foreman_virt_who_configure_config_name')
    interval = FilteredDropdown(
        id='foreman_virt_who_configure_config_interval')
    satellite_url = TextInput(
        id='foreman_virt_who_configure_config_satellite_url')
    hypervisor_id = FilteredDropdown(
        id='foreman_virt_who_configure_config_hypervisor_id')
    debug = Checkbox(id='foreman_virt_who_configure_config_debug')
    proxy = TextInput(id='foreman_virt_who_configure_config_proxy')
    no_proxy = TextInput(id='foreman_virt_who_configure_config_no_proxy')
    filtering = FilteredDropdown(
        id='foreman_virt_who_configure_config_listing_mode')
    filtering_content = ConditionalSwitchableView(reference='filtering')
    hypervisor_type = FilteredDropdown(
        id='foreman_virt_who_configure_config_hypervisor_type')
    hypervisor_content = ConditionalSwitchableView(reference='hypervisor_type')
    submit = Text('//input[@name="commit"]')

    @hypervisor_content.register(
        lambda hypervisor_type: hypervisor_type.endswith(
            ('(esx)', '(rhevm)', '(hyperv)', '(xen)')))
    class HypervisorForm(View):
        server = TextInput(
            id='foreman_virt_who_configure_config_hypervisor_server')
        username = TextInput(
            id='foreman_virt_who_configure_config_hypervisor_username')
        password = TextInput(
            id='foreman_virt_who_configure_config_hypervisor_password')

    @hypervisor_content.register('libvirt')
    class LibvirtForm(View):
        server = TextInput(
            id='foreman_virt_who_configure_config_hypervisor_server')
        username = TextInput(
            id='foreman_virt_who_configure_config_hypervisor_username')

    @hypervisor_content.register('Container-native virtualization')
    class KubevirtForm(View):
        server = TextInput(
            id='foreman_virt_who_configure_config_hypervisor_server')
        kubeconfig = TextInput(
            id='foreman_virt_who_configure_config_kubeconfig_path')

    @filtering_content.register('Unlimited', default=True)
    class FilterUnlimitedForm(View):
        pass

    @filtering_content.register('Whitelist')
    class FilterWhitelistForm(View):
        filter_hosts = TextInput(
            id='foreman_virt_who_configure_config_whitelist')
        filter_host_parents = TextInput(
            id='foreman_virt_who_configure_config_filter_host_parents')

    @filtering_content.register('Blacklist')
    class FilterBlacklistForm(View):
        exclude_hosts = TextInput(
            id='foreman_virt_who_configure_config_blacklist')
        exclude_host_parents = TextInput(
            id='foreman_virt_who_configure_config_exclude_host_parents')

    @property
    def is_displayed(self):
        breadcrumb_loaded = self.browser.wait_for_element(self.breadcrumb,
                                                          exception=False)
        return (breadcrumb_loaded and self.breadcrumb.locations[0]
                == 'Satellite Virt Who Configure Configs'
                and self.breadcrumb.read() == 'New Virt-who Config')
Exemple #20
0
 class BondForm(View):
     mode = FilteredDropdown(id='_mode')
     attached_devices = TextInput(
         locator=".//input[contains(@id, '_attached_devices')]")
     bond_options = TextInput(
         locator=".//input[contains(@id, '_bond_options')]")
Exemple #21
0
class ComputeResourceLibvirtProfileNetworkItem(GenericRemovableWidgetItem):
    """Libvirt Compute Resource Profile "Network interface" item widget"""
    network_type = FilteredDropdown(id="type")
    network = FilteredDropdown(id="bridge")
    nic_type = FilteredDropdown(id="model")
Exemple #22
0
 class host(SatTab):
     name = TextInput(id='host_name')
     organization = FilteredDropdown(id='host_organization')
     location = FilteredDropdown(id='host_location')
     hostgroup = FilteredDropdown(id='host_hostgroup')
     inherit_deploy_option = ToggleButton(
         locator=".//div[label[@for='compute_resource_id']]//button")
     deploy = FilteredDropdown(id='host_compute_resource')
     lce = FilteredDropdown(id='host_lifecycle_environment')
     content_view = FilteredDropdown(id='host_content_view')
     content_source = FilteredDropdown(id='s2id_content_source_id')
     reset_puppet_environment = Link(".//a[@id='reset_puppet_environment']")
     inherit_puppet_environment = ToggleButton(
         locator=".//div[label[@for='environment_id']]//button")
     puppet_environment = FilteredDropdown(id='host_environment')
     puppet_master = FilteredDropdown(id='host_puppet_proxy')
     puppet_ca = FilteredDropdown(id='host_puppet_ca_proxy')
     openscap_capsule = FilteredDropdown(id='host_openscap_proxy')
Exemple #23
0
class ComputeResourceRHVProfileNetworkItem(GenericRemovableWidgetItem):
    """RHV Compute Resource profile "Network interface" item widget"""
    name = TextInput(locator=".//input[contains(@id, 'name')]")
    network = FilteredDropdown(id="network")
    interface_type = FilteredDropdown(id="interface")
Exemple #24
0
class ResourceProviderCreateView(BaseLoggedInView):
    breadcrumb = BreadCrumb()
    name = TextInput(id='compute_resource_name')
    description = TextInput(id='compute_resource_description')
    submit = Text('//input[@name="commit"]')

    provider = FilteredDropdown(id='s2id_compute_resource_provider')
    provider_content = ConditionalSwitchableView(reference='provider')

    @provider_content.register('EC2')
    class EC2ProviderForm(View):
        access_key = TextInput(id='compute_resource_user')
        secret_key = TextInput(id='compute_resource_password')

        @View.nested
        class region(View):
            load_regions = Text("//a[contains(@id,'test_connection_button')]")
            value = FilteredDropdown(id='s2id_compute_resource_region')

            def before_fill(self, values=None):
                self.load_regions.click()

        @View.nested
        class http_proxy(View):
            value = FilteredDropdown(id='compute_resource_http_proxy_id')

    @provider_content.register('Google')
    class GCEProviderForm(View):
        google_project_id = TextInput(id='compute_resource_project')
        client_email = TextInput(id='compute_resource_email')
        certificate_path = TextInput(id='compute_resource_key_path')

        @View.nested
        class zone(View):
            load_zones = Text("//a[contains(@id,'test_connection_button')]")
            value = FilteredDropdown(id='s2id_compute_resource_zone')

            def before_fill(self, values=None):
                self.load_zones.click()

        @View.nested
        class http_proxy(View):
            value = FilteredDropdown(id='compute_resource_http_proxy_id')

    @provider_content.register('Libvirt')
    class LibvirtProviderForm(View):
        url = TextInput(id='compute_resource_url')
        display_type = Select(id='compute_resource_display_type')
        console_passwords = Checkbox(
            id='compute_resource_set_console_password')

    @provider_content.register('RHEL OpenStack Platform')
    class OpenStackProviderForm(View):
        url = TextInput(id='compute_resource_url')
        user = TextInput(id='compute_resource_user')
        password = TextInput(id='compute_resource_password')
        domain = TextInput(id='compute_resource_domain')

    @provider_content.register('Rackspace')
    class RackspaceProviderForm(View):
        url = TextInput(id='compute_resource_url')
        user = TextInput(id='compute_resource_user')
        api_key = TextInput(id='compute_resource_password')
        region = Select(id='compute_resource_region')

    @provider_content.register('VMware')
    class VMwareProviderForm(View):
        vcenter = TextInput(id='compute_resource_server')
        user = TextInput(id='compute_resource_user')
        password = TextInput(id='compute_resource_password')
        display_type = Select(id='compute_resource_display_type')
        vnc_console_passwords = Checkbox(
            id='compute_resource_set_console_password')
        enable_caching = Checkbox(id='compute_resource_caching_enabled')

        @View.nested
        class datacenter(View):
            load_datacenters = Text(
                "//a[contains(@id,'test_connection_button')]")
            value = FilteredDropdown(id='s2id_compute_resource_datacenter')

            def before_fill(self, values=None):
                self.load_datacenters.click()

    @provider_content.register('RHV')
    class RHVProviderForm(View):
        url = TextInput(id='compute_resource_url')
        user = TextInput(id='compute_resource_user')
        password = TextInput(id='compute_resource_password')
        api4 = Checkbox(id='compute_resource_use_v4')
        certification_authorities = TextInput(id='compute_resource_public_key')

        @View.nested
        class datacenter(View):
            load_datacenters = Text(
                "//a[contains(@id,'test_connection_button')]")
            value = FilteredDropdown(id='s2id_compute_resource_uuid')

            def before_fill(self, values=None):
                self.load_datacenters.click()

    @View.nested
    class compute_resource(SatTab):
        TAB_NAME = 'Compute Resource'

    @View.nested
    class locations(SatTab):
        resources = MultiSelect(id='ms-compute_resource_location_ids')

    @View.nested
    class organizations(SatTab):
        resources = MultiSelect(id='ms-compute_resource_organization_ids')

    @property
    def is_displayed(self):
        breadcrumb_loaded = self.browser.wait_for_element(self.breadcrumb,
                                                          exception=False)
        return (breadcrumb_loaded
                and self.breadcrumb.locations[0] == 'Compute Resources'
                and self.breadcrumb.read() == 'Create Compute Resource')
Exemple #25
0
class ResourceProviderProfileView(BaseLoggedInView):
    breadcrumb = BreadCrumb()
    compute_profile = FilteredDropdown(
        id='s2id_compute_attribute_compute_profile_id')
    compute_resource = FilteredDropdown(
        id='s2id_compute_attribute_compute_resource_id')

    provider_content = ConditionalSwitchableView(reference='current_provider')

    submit = Text('//input[@name="commit"]')

    @property
    def current_provider(self):
        """Retrieve the provider name from the compute resource name.

        Note: The provider name is always appended to the end of the compute resource name,
        for example: compute resource name "foo"

        1. For RHV provider, the compute resource name will be displayed as: "foo (RHV)"
        2. For EC2 provider, the compute resource name will be displayed as:
            "foo (ca-central-1-EC2)" where "ca-central-1" is the region.
        """
        compute_resource_name = self.compute_resource.read()
        return re.findall(r'.*\((?:.*-)*(.*?)\)\Z|$', compute_resource_name)[0]

    @provider_content.register('Libvirt')
    class LibvirtResourceForm(View):
        cpus = TextInput(id='compute_attribute_vm_attrs_cpus')
        cpu_mode = FilteredDropdown(
            id='s2id_compute_attribute_vm_attrs_cpu_mode')
        memory = TextInput(id='compute_attribute_vm_attrs_memory')
        image = FilteredDropdown(id='s2id_compute_attribute_vm_attrs_image_id')

        @View.nested
        class network_interfaces(RemovableWidgetsItemsListView):
            ROOT = "//fieldset[@id='network_interfaces']"
            ITEM_WIDGET_CLASS = ComputeResourceLibvirtProfileNetworkItem

        @View.nested
        class storage(RemovableWidgetsItemsListView):
            ROOT = "//fieldset[@id='storage_volumes']"
            ITEMS = "./div/div[contains(@class, 'removable-item')]"
            ITEM_WIDGET_CLASS = ComputeResourceLibvirtProfileStorageItem

    @provider_content.register('EC2')
    class EC2ResourceForm(View):
        flavor = FilteredDropdown(
            id='s2id_compute_attribute_vm_attrs_flavor_id')
        image = FilteredDropdown(id='s2id_compute_attribute_vm_attrs_image_id')
        availability_zone = FilteredDropdown(
            id='s2id_compute_attribute_vm_attrs_availability_zone')
        subnet = FilteredDropdown(
            id='s2id_compute_attribute_vm_attrs_subnet_id')
        security_groups = MultiSelect(
            id='ms-compute_attribute_vm_attrs_security_group_ids')
        managed_ip = FilteredDropdown(
            id='s2id_compute_attribute_vm_attrs_managed_ip')

    @provider_content.register('Google')
    class GCEResourceForm(View):
        machine_type = FilteredDropdown(
            id='s2id_compute_attribute_vm_attrs_machine_type')
        image = FilteredDropdown(id='s2id_compute_attribute_vm_attrs_image_id')
        network = FilteredDropdown(
            id='s2id_compute_attribute_vm_attrs_network')
        external_ip = Checkbox(
            id='compute_attribute_vm_attrs_associate_external_ip')
        default_disk_size = TextInput(
            id='compute_attribute_vm_attrs_volumes_attributes_0_size_gb')

    @provider_content.register('RHV')
    class RHVResourceForm(View):
        cluster = FilteredDropdown(
            id='s2id_compute_attribute_vm_attrs_cluster')
        template = FilteredDropdown(
            id='s2id_compute_attribute_vm_attrs_template')
        instance_type = FilteredDropdown(
            id='s2id_compute_attribute_vm_attrs_instance_type')
        cores = TextInput(id='compute_attribute_vm_attrs_cores')
        sockets = TextInput(id='compute_attribute_vm_attrs_sockets')
        memory = TextInput(id='compute_attribute_vm_attrs_memory')
        highly_available = Checkbox(id='compute_attribute_vm_attrs_ha')

        @View.nested
        class network_interfaces(RemovableWidgetsItemsListView):
            ROOT = "//fieldset[@id='network_interfaces']"
            ITEM_WIDGET_CLASS = ComputeResourceRHVProfileNetworkItem

        @View.nested
        class storage(RemovableWidgetsItemsListView):
            ROOT = "//fieldset[@id='storage_volumes']"
            ITEMS = "./div/div[contains(@class, 'removable-item')]"
            ITEM_WIDGET_CLASS = ComputeResourceRHVProfileStorageItem

    @provider_content.register('VMware')
    class VMwareResourceForm(View):
        cpus = TextInput(id='compute_attribute_vm_attrs_cpus')
        cores_per_socket = TextInput(
            id='compute_attribute_vm_attrs_corespersocket')
        memory = TextInput(id='compute_attribute_vm_attrs_memory_mb')
        firmware = RadioGroup(
            "//div[label[input[contains(@id, 'compute_attribute_vm_attrs_firmware')]]]"
        )
        cluster = FilteredDropdown(
            id='s2id_compute_attribute_vm_attrs_cluster')
        resource_pool = FilteredDropdown(
            id='s2id_compute_attribute_vm_attrs_resource_pool')
        folder = FilteredDropdown(id='s2id_compute_attribute_vm_attrs_path')
        guest_os = FilteredDropdown(
            id='s2id_compute_attribute_vm_attrs_guest_id')
        virtual_hw_version = FilteredDropdown(
            id='s2id_compute_attribute_vm_attrs_hardware_version')
        memory_hot_add = Checkbox(
            id='compute_attribute_vm_attrs_memoryHotAddEnabled')
        cpu_hot_add = Checkbox(
            id='compute_attribute_vm_attrs_cpuHotAddEnabled')
        cdrom_drive = Checkbox(id='compute_attribute_vm_attrs_add_cdrom')
        annotation_notes = TextInput(
            id='compute_attribute_vm_attrs_annotation')
        image = FilteredDropdown(id='s2id_compute_attribute_vm_attrs_image_id')

        @View.nested
        class network_interfaces(RemovableWidgetsItemsListView):
            ROOT = "//fieldset[@id='network_interfaces']"
            ITEM_WIDGET_CLASS = ComputeResourceVMwareProfileNetworkItem

        @View.nested
        class storage(RemovableWidgetsItemsListView):
            ROOT = "//div[@id='scsi_controllers']"
            ITEMS = ".//div[@class='controller-container']"
            ITEM_WIDGET_CLASS = ComputeResourceVMwareProfileStorageItem
            add_item_button = Text(
                ".//button[contains(@class, 'add-controller')]")

    @property
    def is_displayed(self):
        breadcrumb_loaded = self.browser.wait_for_element(
            self.breadcrumb,
            exception=False,
            ensure_page_safe=True,
            timeout=10)
        if not breadcrumb_loaded:
            return False
        breadcrumb_text = self.breadcrumb.read()
        return (self.breadcrumb.locations[0] == 'Compute Resources'
                and self.breadcrumb.locations[2] == 'Compute Profiles'
                and (breadcrumb_text.startswith('Edit ')
                     or breadcrumb_text.startswith('New ')))
 class type(SatTab):
     snippet = Checkbox(id='provisioning_template_snippet')
     template_type = FilteredDropdown(
         id='provisioning_template_template_kind')