Skip to content
This repository has been archived by the owner on Apr 7, 2022. It is now read-only.

Commit

Permalink
Merge pull request #8259 from jadhaj/public_private_flavors
Browse files Browse the repository at this point in the history
[1LP][RFR] Add test from flavors management RFE
  • Loading branch information
mshriver committed Dec 14, 2018
2 parents a4a0f3f + 9c3cbd7 commit 954840b
Show file tree
Hide file tree
Showing 2 changed files with 88 additions and 6 deletions.
14 changes: 9 additions & 5 deletions cfme/cloud/flavor.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@
import attr

from navmazing import NavigateToAttribute, NavigateToSibling
from widgetastic_patternfly import (Accordion, BootstrapSwitch, BreadCrumb, Button,
from widgetastic_patternfly import (BootstrapSelect, BootstrapSwitch, BreadCrumb, Button,
Dropdown, TextInput, View)

from widgetastic.widget import Text, Select

from cfme.base.ui import BaseLoggedInPage
from cfme.common import Taggable
from cfme.common import Taggable, TaggableCollection
from cfme.exceptions import FlavorNotFound, ItemNotFound
from cfme.modeling.base import BaseEntity, BaseCollection
from cfme.utils.appliance.implementations.ui import CFMENavigateStep, navigator, navigate_to
Expand Down Expand Up @@ -119,6 +119,7 @@ class FlavorAddForm(View):
swap_size = TextInput(name='swap')
rxtx_factor = TextInput(name='rxtx_factor')
public = BootstrapSwitch(name='is_public')
tenant = BootstrapSelect(id='cloud_tenant')
add = Button('Add')
cancel = Button('Cancel')

Expand Down Expand Up @@ -151,6 +152,8 @@ class Flavor(BaseEntity, Taggable):
swap = attr.ib(default=None)
rxtx = attr.ib(default=None)
is_public = attr.ib(default=True)
tenant = attr.ib(default=None)


def delete(self, cancel=False):
"""Delete current falvor """
Expand Down Expand Up @@ -183,10 +186,10 @@ def instance_count(self):


@attr.s
class FlavorCollection(BaseCollection):
class FlavorCollection(BaseCollection, TaggableCollection):
ENTITY = Flavor

def create(self, name, provider, ram, vcpus, disk, swap, rxtx, is_public=True, cancel=False):
def create(self, name, provider, ram, vcpus, disk, swap, rxtx, is_public=True, tenant=None, cancel=False):
"""Create new falvor"""
view = navigate_to(self, 'Add')
form_params = {'provider': provider.name,
Expand All @@ -196,7 +199,8 @@ def create(self, name, provider, ram, vcpus, disk, swap, rxtx, is_public=True, c
'disk_size': disk,
'swap_size': swap,
'rxtx_factor': rxtx,
'public': is_public}
'public': is_public,
'tenant': tenant}

view.form.fill(form_params)

Expand Down
80 changes: 79 additions & 1 deletion cfme/tests/openstack/cloud/test_flavors.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from cfme.cloud.instance.openstack import OpenStackInstance
from cfme.cloud.provider.openstack import OpenStackProvider
from cfme.utils.appliance.implementations.ui import navigator, navigate_to
from cfme.utils.blockers import BZ
from cfme.utils.wait import wait_for
from widgetastic.utils import partial_match

Expand Down Expand Up @@ -38,6 +39,7 @@ def zero_disk_flavor(provider):

@pytest.fixture(scope='function')
def private_flavor(appliance, provider):
prov_data = provider.data['provisioning']
collection = appliance.collections.cloud_flavors
private_flavor = collection.create(name=fauxfactory.gen_alpha(),
provider=provider,
Expand All @@ -46,7 +48,8 @@ def private_flavor(appliance, provider):
disk=DISK_SIZE,
swap=SWAP_SIZE,
rxtx=RXTX,
is_public=False)
is_public=False,
tenant=prov_data['cloud_tenant'])

view = appliance.browser.create_view(navigator.get_class(collection, 'All').VIEW)
view.flash.assert_success_message(
Expand Down Expand Up @@ -95,6 +98,40 @@ def new_instance(provider, zero_disk_flavor):
instance.cleanup_on_provider()


@pytest.fixture(scope='function')
def instance_with_private_flavor(provider, private_flavor):
prov_data = provider.data['provisioning']
flavor_name = private_flavor.name
prov_form_data = {
'request': {'email': fauxfactory.gen_email(),
'first_name': fauxfactory.gen_alpha(),
'last_name': fauxfactory.gen_alpha()},
'catalog': {'num_vms': '1',
'vm_name': fauxfactory.gen_alpha()},
'environment': {'cloud_network': prov_data['cloud_network'],
'cloud_tenant': prov_data['cloud_tenant']},
'properties': {'instance_type': partial_match(flavor_name)},
}

instance_name = prov_form_data['catalog']['vm_name']

try:
instance = provider.appliance.collections.cloud_instances.create(
instance_name,
provider,
prov_form_data, find_in_cfme=True
)

except KeyError:
# some yaml value wasn't found
pytest.skip('Unable to find an image map in provider "{}" provisioning data: {}'
.format(provider, prov_data))

yield instance

instance.cleanup_on_provider()


@pytest.mark.rfe
@pytest.mark.ignore_stream('5.9')
def test_create_instance_with_zero_disk_flavor(new_instance, soft_assert):
Expand Down Expand Up @@ -199,3 +236,44 @@ def test_flavor_details(appliance, soft_assert, private_flavor):

soft_assert(view.entities.relationships.get_text_of('Cloud Provider') ==
private_flavor.provider.name)


@pytest.mark.rfe
@pytest.mark.ignore_stream('5.9')
def test_create_instance_with_private_flavor(instance_with_private_flavor, provider, soft_assert):
view = navigate_to(instance_with_private_flavor, 'Details')
prov_data = provider.data['provisioning']
power_state = view.entities.summary('Power Management').get_text_of('Power State')
assert power_state == OpenStackInstance.STATE_ON

vm_tmplt = view.entities.summary('Relationships').get_text_of('VM Template')
soft_assert(vm_tmplt == prov_data['image']['name'])

flavor = view.entities.summary('Relationships').get_text_of('Flavor')
flavors = [flv.name for flv in provider.appliance.collections.cloud_flavors.all()]
soft_assert(flavor in flavors)

props = {"Availability Zone": "availability_zone",
"Cloud Tenants": "cloud_tenant",
"Virtual Private Cloud": "cloud_network"}

view = navigate_to(instance_with_private_flavor, 'Details')
for key, val in props.items():
v = view.entities.summary('Relationships').get_text_of(key)
soft_assert(v == prov_data[val])

collection = provider.appliance.collections.cloud_flavors
flavor_obj = collection.instantiate(flavor, provider)
assert flavor_obj.instance_count == 1

flavor_obj.delete()
view = navigate_to(collection, "All")
view.flash.assert_success_message(
'Delete of Flavor "{name}" was successfully initiated.'.format(name=flavor_obj.name))

wait_for(lambda: not flavor_obj.exists, delay=5, timeout=600, fail_func=flavor_obj.refresh,
message='Wait for flavor to disappear')

view = navigate_to(instance_with_private_flavor, 'Details')
power_state = view.entities.summary('Power Management').get_text_of('Power State')
assert power_state == OpenStackInstance.STATE_ON

0 comments on commit 954840b

Please sign in to comment.