import attr
from navmazing import NavigateToAttribute, NavigateToSibling
from widgetastic.exceptions import NoSuchElementException
from cfme.common import WidgetasticTaggable
from cfme.exceptions import ItemNotFound
from cfme.modeling.base import BaseCollection, BaseEntity, parent_of_type
from cfme.networks.views import (CloudNetworkAddView, CloudNetworkEditView, CloudNetworkDetailsView,
CloudNetworkView)
from cfme.utils import providers, version
from cfme.utils.appliance.implementations.ui import navigator, CFMENavigateStep, navigate_to
from cfme.utils.wait import wait_for
@attr.s
[docs]class CloudNetwork(WidgetasticTaggable, BaseEntity):
"""Class representing cloud networks in cfme database"""
in_version = ('5.8', version.LATEST)
category = 'networks'
string_name = 'CloudNetwork'
quad_name = None
db_types = ['CloudNetwork']
name = attr.ib()
provider_obj = attr.ib(default=None)
@property
def provider(self):
from cfme.networks.provider import NetworkProvider
return parent_of_type(self, NetworkProvider)
@property
def exists(self):
try:
navigate_to(self, 'Details')
except (ItemNotFound, NoSuchElementException):
return False
else:
return True
@property
def parent_provider(self):
""" Return object of parent cloud provider """
view = navigate_to(self, 'Details')
provider_name = view.entities.relationships.get_text_of('Parent ems cloud')
return providers.get_crud_by_name(provider_name)
@property
def network_type(self):
""" Return type of network """
view = navigate_to(self, 'Details')
return view.entities.properties.get_text_of('Type')
@property
def cloud_tenant(self):
"""Return name of tenant that network belongs to"""
view = navigate_to(self, 'Details')
return view.entities.relationships.get_text_of('Cloud tenant')
[docs] def edit(self, name, change_external=None, change_admin_state=None, change_shared=None):
"""Edit cloud network
Args:
name: (str) new network name
change_external: (bool) is network external
change_admin_state: (bool) network's administrative state, 'Up' or 'Down'
change_shared: (bool) is network shared, 'Yes' or 'No'
"""
view = navigate_to(self, 'Edit')
view.fill({'network_name': name,
'ext_router': change_external,
'administrative_state': change_admin_state,
'shared': change_shared})
view.save.click()
view.flash.assert_success_message('Cloud Network "{}" updated'.format(name))
self.name = name
[docs] def delete(self):
"""Delete this cloud network"""
view = navigate_to(self, 'Details')
view.toolbar.configuration.item_select('Delete this Cloud Network', handle_alert=True)
view.flash.assert_success_message('The selected Cloud Network was deleted')
@property
def network_provider(self):
""" Returns network provider """
# security group collection contains reference to provider
if self.provider:
return self.provider
# otherwise get provider name from ui
view = navigate_to(self, 'Details')
try:
prov_name = view.entities.relationships.get_text_of("Network Manager")
collection = self.appliance.collections.network_provider
return collection.instantiate(name=prov_name)
except ItemNotFound: # BZ 1480577
return None
@attr.s
[docs]class CloudNetworkCollection(BaseCollection):
"""Collection object for Cloud Network object"""
ENTITY = CloudNetwork
[docs] def create(self, name, tenant, provider, network_manager, network_type, is_external=False,
admin_state=True, is_shared=False):
"""Create cloud network
Args:
name: (str) name of the network
tenant: (str) name of cloud tenant to place network to
provider: crud object of Openstack Cloud provider
network_manager: (str) name of network manager
network_type: (str) type of network, such as 'VXLAN', 'VLAN', 'GRE' etc.
is_external: (bool) is network external
admin_state: (bool) network's initial administrative state, True stands for 'Up',
False - 'Down'
is_shared: (bool) is network shared
Returns:
instance of cfme.networks.cloud_network.CloudNetwork
"""
view = navigate_to(self, 'Add')
view.fill({'network_manager': network_manager,
'cloud_tenant': tenant,
'network_type': network_type,
'network_name': name,
'ext_router': is_external,
'administrative_state': admin_state,
'shared': is_shared})
view.add.click()
view.flash.assert_success_message('Cloud Network "{}" created'.format(name))
network = self.instantiate(name, provider)
# Refresh provider's relationships to have new network displayed
wait_for(provider.is_refreshed, func_kwargs=dict(refresh_delta=10), timeout=600)
wait_for(lambda: network.exists, timeout=100, fail_func=network.browser.refresh)
return network
[docs] def all(self):
if self.filters.get('parent'):
view = navigate_to(self.filters.get('parent'), 'CloudNetworks')
else:
view = navigate_to(self, 'All')
list_networks_obj = view.entities.get_all(surf_pages=True)
return [self.instantiate(name=n.name, provider_obj=None) for n in list_networks_obj]
@navigator.register(CloudNetworkCollection, 'All')
[docs]class All(CFMENavigateStep):
VIEW = CloudNetworkView
prerequisite = NavigateToAttribute('appliance.server', 'LoggedIn')
[docs] def step(self):
self.prerequisite_view.navigation.select('Networks', 'Networks')
@navigator.register(CloudNetwork, 'Details')
[docs]class Details(CFMENavigateStep):
prerequisite = NavigateToAttribute('parent', 'All')
VIEW = CloudNetworkDetailsView
[docs] def step(self):
self.prerequisite_view.entities.get_entity(name=self.obj.name).click()
@navigator.register(CloudNetworkCollection, 'Add')
[docs]class Add(CFMENavigateStep):
prerequisite = NavigateToSibling('All')
VIEW = CloudNetworkAddView
[docs] def step(self):
self.prerequisite_view.toolbar.configuration.item_select('Add a new Cloud Network')
@navigator.register(CloudNetwork, 'Edit')
[docs]class Edit(CFMENavigateStep):
prerequisite = NavigateToSibling('Details')
VIEW = CloudNetworkEditView
[docs] def step(self):
self.prerequisite_view.toolbar.configuration.item_select('Edit this Cloud Network')