Split muranodashboard config into multiple files

This commit splits muranodashboard's config file into multiple small
file, each adding a dashboard or a panel. It also adds machinery to
allow sharing app-catalog dashboard config file between muranodashboard
and app-catalog-ui.
Renames dashboard and panels in accordance to
https://etherpad.openstack.org/p/apps-dashboard-structure

Targets bp: catalog-dashboard-reorg

Depends-On: I6d1d8c99aecf10567608d0c96de69a5309e706e3
Change-Id: I7aee5d26185cc0a7bb54f2b39b85d580daa400ae
This commit is contained in:
Kirill Zaitsev 2016-08-29 02:16:10 +03:00
parent 9fb1fcb83c
commit 7378be6d21
22 changed files with 184 additions and 97 deletions

View File

@ -9,8 +9,7 @@
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
"""API for the murano packages service. """API for the murano packages service."""
"""
from django.views import generic from django.views import generic
from openstack_dashboard.api.rest import utils as rest_utils from openstack_dashboard.api.rest import utils as rest_utils
@ -24,8 +23,7 @@ CLIENT_KEYWORDS = {'marker', 'sort_dir', 'paginate'}
@urls.register @urls.register
class Packages(generic.View): class Packages(generic.View):
"""API for Murano packages. """API for Murano packages."""
"""
url_regex = r'app-catalog/packages/$' url_regex = r'app-catalog/packages/$'
@rest_utils.ajax() @rest_utils.ajax()

View File

@ -15,12 +15,7 @@
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
import horizon import horizon
from muranodashboard import dashboard
class AppCatalog(horizon.Panel): class AppCatalog(horizon.Panel):
name = _('Browse') name = _('Browse Local')
slug = 'catalog' slug = 'catalog'
dashboard.Murano.register(AppCatalog)

View File

@ -15,13 +15,8 @@
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
import horizon import horizon
from muranodashboard import dashboard
class Categories(horizon.Panel): class Categories(horizon.Panel):
name = _("Categories") name = _("Categories")
slug = 'categories' slug = 'categories'
policy_rules = (("murano", "get_category"),) policy_rules = (("murano", "get_category"),)
dashboard.Murano.register(Categories)

View File

@ -18,29 +18,15 @@ import horizon
# Load the api rest services into Horizon # Load the api rest services into Horizon
import muranodashboard.api.rest # noqa import muranodashboard.api.rest # noqa
from muranodashboard import exceptions
# prevent pyflakes from fail
assert exceptions
class DeployPanels(horizon.PanelGroup): class AppCatalog(horizon.Dashboard):
slug = "deployment_group" name = getattr(settings, 'MURANO_DASHBOARD_NAME', _("App Catalog"))
name = _("Catalog")
panels = ("environments", "catalog")
class ManagePanels(horizon.PanelGroup):
slug = "manage_metadata"
name = _("Manage")
panels = ("images", "packages", "categories")
class Murano(horizon.Dashboard):
name = getattr(settings, 'MURANO_DASHBOARD_NAME', _("Applications"))
slug = "app-catalog" slug = "app-catalog"
panels = (DeployPanels, ManagePanels)
default_panel = "environments" default_panel = "environments"
supports_tenants = True supports_tenants = True
try:
horizon.register(Murano) horizon.base.Horizon.registered('app-catalog')
except horizon.base.NotRegistered:
horizon.register(AppCatalog)

View File

@ -15,13 +15,8 @@
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
import horizon import horizon
from muranodashboard import dashboard
class Environments(horizon.Panel): class Environments(horizon.Panel):
name = _("Environments") name = _("Environments")
slug = 'environments' slug = 'environments'
policy_rules = (("murano", "list_environments"),) policy_rules = (("murano", "list_environments"),)
dashboard.Murano.register(Environments)

View File

@ -15,12 +15,7 @@
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
import horizon import horizon
from muranodashboard import dashboard
class Images(horizon.Panel): class Images(horizon.Panel):
name = _("Images") name = _("Images")
slug = 'images' slug = 'images'
dashboard.Murano.register(Images)

View File

@ -0,0 +1,5 @@
# The name of the dashboard to be added to HORIZON['dashboards']. Required.
DASHBOARD = 'app-catalog'
# If set to True, this dashboard will not be added to the settings.
DISABLED = False

View File

@ -12,12 +12,6 @@
from muranodashboard import exceptions from muranodashboard import exceptions
# The name of the dashboard to be added to HORIZON['dashboards']. Required.
DASHBOARD = 'app-catalog'
# If set to True, this dashboard will not be added to the settings.
DISABLED = False
ADD_INSTALLED_APPS = [ ADD_INSTALLED_APPS = [
'muranodashboard', 'muranodashboard',
] ]
@ -39,3 +33,5 @@ ADD_JS_FILES = [
'app/murano/murano.module.js' 'app/murano/murano.module.js'
] ]
FEATURE = True

View File

@ -0,0 +1,8 @@
from django.utils.translation import ugettext_lazy as _
# The name of the panel group to be added to HORIZON_CONFIG. Required.
PANEL_GROUP = 'app-catalog_browse_group'
# The display name of the PANEL_GROUP. Required.
PANEL_GROUP_NAME = _('Browse')
# The name of the dashboard the PANEL_GROUP associated with. Required.
PANEL_GROUP_DASHBOARD = 'app-catalog'

View File

@ -0,0 +1,9 @@
# The name of the panel to be added to HORIZON_CONFIG. Required.
PANEL = 'catalog'
# The name of the dashboard the PANEL associated with. Required.
PANEL_DASHBOARD = 'app-catalog'
# The name of the panel group the PANEL is associated with.
PANEL_GROUP = 'app-catalog_browse_group'
# Python panel class of the PANEL to be added.
ADD_PANEL = 'muranodashboard.catalog.panel.AppCatalog'

View File

@ -0,0 +1,8 @@
from django.utils.translation import ugettext_lazy as _
# The name of the panel group to be added to HORIZON_CONFIG. Required.
PANEL_GROUP = 'app-catalog_manage_group'
# The display name of the PANEL_GROUP. Required.
PANEL_GROUP_NAME = _('Manage')
# The name of the dashboard the PANEL_GROUP associated with. Required.
PANEL_GROUP_DASHBOARD = 'app-catalog'

View File

@ -0,0 +1,9 @@
# The name of the panel to be added to HORIZON_CONFIG. Required.
PANEL = 'packages'
# The name of the dashboard the PANEL associated with. Required.
PANEL_DASHBOARD = 'app-catalog'
# The name of the panel group the PANEL is associated with.
PANEL_GROUP = 'app-catalog_manage_group'
# Python panel class of the PANEL to be added.
ADD_PANEL = 'muranodashboard.packages.panel.PackageDefinitions'

View File

@ -0,0 +1,9 @@
# The name of the panel to be added to HORIZON_CONFIG. Required.
PANEL = 'images'
# The name of the dashboard the PANEL associated with. Required.
PANEL_DASHBOARD = 'app-catalog'
# The name of the panel group the PANEL is associated with.
PANEL_GROUP = 'app-catalog_manage_group'
# Python panel class of the PANEL to be added.
ADD_PANEL = 'muranodashboard.images.panel.Images'

View File

@ -0,0 +1,9 @@
# The name of the panel to be added to HORIZON_CONFIG. Required.
PANEL = 'categories'
# The name of the dashboard the PANEL associated with. Required.
PANEL_DASHBOARD = 'app-catalog'
# The name of the panel group the PANEL is associated with.
PANEL_GROUP = 'app-catalog_manage_group'
# Python panel class of the PANEL to be added.
ADD_PANEL = 'muranodashboard.categories.panel.Categories'

View File

@ -0,0 +1,8 @@
from django.utils.translation import ugettext_lazy as _
# The name of the panel group to be added to HORIZON_CONFIG. Required.
PANEL_GROUP = 'app-catalog_applications_group'
# The display name of the PANEL_GROUP. Required.
PANEL_GROUP_NAME = _('Applications')
# The name of the dashboard the PANEL_GROUP associated with. Required.
PANEL_GROUP_DASHBOARD = 'app-catalog'

View File

@ -0,0 +1,9 @@
# The name of the panel to be added to HORIZON_CONFIG. Required.
PANEL = 'environments'
# The name of the dashboard the PANEL associated with. Required.
PANEL_DASHBOARD = 'app-catalog'
# The name of the panel group the PANEL is associated with.
PANEL_GROUP = 'app-catalog_applications_group'
# Python panel class of the PANEL to be added.
ADD_PANEL = 'muranodashboard.environments.panel.Environments'

View File

@ -11,9 +11,9 @@ MURANO_REPO_URL = 'http://apps.openstack.org/api/v1/murano_repo/liberty/'
DISPLAY_MURANO_REPO_URL = 'http://apps.openstack.org/#tab=murano-apps' DISPLAY_MURANO_REPO_URL = 'http://apps.openstack.org/#tab=murano-apps'
# Overrides the default dashboard name (Murano) that is displayed # Overrides the default dashboard name (App Catalog) that is displayed
# in the main accordion navigation # in the main accordion navigation
# MURANO_DASHBOARD_NAME = "Murano" # MURANO_DASHBOARD_NAME = "App Catalog"
# Specify a maximum number of limit packages. # Specify a maximum number of limit packages.
# PACKAGES_LIMIT = 100 # PACKAGES_LIMIT = 100

View File

@ -15,13 +15,8 @@
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
import horizon import horizon
from muranodashboard import dashboard
class PackageDefinitions(horizon.Panel): class PackageDefinitions(horizon.Panel):
name = _("Packages") name = _("Packages")
slug = 'packages' slug = 'packages'
policy_rules = (("murano", "get_package"),) policy_rules = (("murano", "get_package"),)
dashboard.Murano.register(PackageDefinitions)

View File

@ -218,7 +218,7 @@ class UITestCase(BaseDeps):
self.fill_field(by.By.ID, 'id_username', username) self.fill_field(by.By.ID, 'id_username', username)
self.fill_field(by.By.ID, 'id_password', password) self.fill_field(by.By.ID, 'id_password', password)
self.driver.find_element_by_xpath("//button[@type='submit']").click() self.driver.find_element_by_xpath("//button[@type='submit']").click()
murano = self.driver.find_element_by_xpath(consts.Applications) murano = self.driver.find_element_by_xpath(consts.AppCatalog)
if 'collapsed' in murano.get_attribute('class'): if 'collapsed' in murano.get_attribute('class'):
murano.click() murano.click()
@ -524,7 +524,8 @@ class ApplicationTestCase(ImageTestCase):
self.wait_for_alert_message() self.wait_for_alert_message()
def add_app_to_env(self, app_id, app_name='TestApp', env_id=None): def add_app_to_env(self, app_id, app_name='TestApp', env_id=None):
self.go_to_submenu('Browse') self.navigate_to('Browse')
self.go_to_submenu('Browse Local')
if env_id: if env_id:
action = 'add' action = 'add'
app = '{0}/{1}'.format(app_id, env_id) app = '{0}/{1}'.format(app_id, env_id)

View File

@ -73,6 +73,7 @@ DeleteComponent = ".btn[id^='services__row_'][id$='__action_delete']"
# Panel's # Panel's
Applications = "//*[@id='main_content']/div[2]//a[contains(text(), 'Applications')]" # noqa AppCatalog = "//*[@id='main_content']/div[2]//a[contains(text(), 'App Catalog')]" # noqa
Catalog = Applications + "/following::a[span[contains(text(), 'Catalog')]]" Browse = AppCatalog + "/following::a[span[contains(text(), 'Browse')]]"
Manage = Applications + "/following::a[span[contains(text(), 'Manage')]]" Manage = AppCatalog + "/following::a[span[contains(text(), 'Manage')]]"
Applications = AppCatalog + "/following::a[span[contains(text(), 'Applications')]]" # noqa

View File

@ -33,11 +33,13 @@ from muranodashboard.tests.functional import utils
class TestSuiteSmoke(base.UITestCase): class TestSuiteSmoke(base.UITestCase):
"""This class keeps smoke tests which check operability of main panels""" """This class keeps smoke tests which check operability of main panels"""
def test_smoke_environments_panel(self): def test_smoke_environments_panel(self):
self.navigate_to('Applications')
self.go_to_submenu('Environments') self.go_to_submenu('Environments')
self.check_panel_is_present('Environments') self.check_panel_is_present('Environments')
def test_smoke_applications_panel(self): def test_smoke_applications_panel(self):
self.go_to_submenu('Browse') self.navigate_to('Browse')
self.go_to_submenu('Browse Local')
self.check_panel_is_present('Browse') self.check_panel_is_present('Browse')
def test_smoke_images_panel(self): def test_smoke_images_panel(self):
@ -60,6 +62,7 @@ class TestSuiteEnvironment(base.ApplicationTestCase):
2. Navigate to this environment 2. Navigate to this environment
3. Go back to environment list and delete created environment 3. Go back to environment list and delete created environment
""" """
self.navigate_to('Applications')
self.go_to_submenu('Environments') self.go_to_submenu('Environments')
self.create_environment('test_create_del_env') self.create_environment('test_create_del_env')
self.go_to_submenu('Environments') self.go_to_submenu('Environments')
@ -74,6 +77,7 @@ class TestSuiteEnvironment(base.ApplicationTestCase):
2. Change environment's name 2. Change environment's name
3. Check that renamed environment is in environment list 3. Check that renamed environment is in environment list
""" """
self.navigate_to('Applications')
self.go_to_submenu('Environments') self.go_to_submenu('Environments')
self.create_environment('test_edit_env') self.create_environment('test_edit_env')
self.go_to_submenu('Environments') self.go_to_submenu('Environments')
@ -92,6 +96,7 @@ class TestSuiteEnvironment(base.ApplicationTestCase):
2. Change environment's name to empty 2. Change environment's name to empty
3. Check warning message appear 3. Check warning message appear
""" """
self.navigate_to('Applications')
self.go_to_submenu('Environments') self.go_to_submenu('Environments')
self.create_environment('test_edit_env') self.create_environment('test_edit_env')
self.go_to_submenu('Environments') self.go_to_submenu('Environments')
@ -109,7 +114,8 @@ class TestSuiteEnvironment(base.ApplicationTestCase):
2. Press 'Create Env' 2. Press 'Create Env'
3. Make sure that it's possible to choose just created environment 3. Make sure that it's possible to choose just created environment
""" """
self.go_to_submenu('Browse') self.navigate_to('Browse')
self.go_to_submenu('Browse Local')
self.driver.find_elements_by_xpath( self.driver.find_elements_by_xpath(
"//a[contains(text(), 'Create Env')]")[0].click() "//a[contains(text(), 'Create Env')]")[0].click()
self.fill_field(by.By.ID, 'id_name', 'TestEnv') self.fill_field(by.By.ID, 'id_name', 'TestEnv')
@ -128,6 +134,7 @@ class TestSuiteEnvironment(base.ApplicationTestCase):
3. Go back to environment list and delete created environment 3. Go back to environment list and delete created environment
""" """
unicode_name = u'$yaql \u2665 unicode' unicode_name = u'$yaql \u2665 unicode'
self.navigate_to('Applications')
self.go_to_submenu('Environments') self.go_to_submenu('Environments')
self.create_environment(unicode_name) self.create_environment(unicode_name)
self.go_to_submenu('Environments') self.go_to_submenu('Environments')
@ -143,6 +150,7 @@ class TestSuiteEnvironment(base.ApplicationTestCase):
3. Check a set of names, if current name isn't valid 3. Check a set of names, if current name isn't valid
appropriate error message should appear appropriate error message should appear
""" """
self.navigate_to('Applications')
self.go_to_submenu('Environments') self.go_to_submenu('Environments')
self.driver.find_element_by_css_selector(c.CreateEnvironment).click() self.driver.find_element_by_css_selector(c.CreateEnvironment).click()
@ -168,6 +176,7 @@ class TestSuiteEnvironment(base.ApplicationTestCase):
""" """
# uuid.uuid4() generates random uuid # uuid.uuid4() generates random uuid
env_name = str(uuid.uuid4()) env_name = str(uuid.uuid4())
self.navigate_to('Applications')
self.go_to_submenu('Environments') self.go_to_submenu('Environments')
self.create_environment(env_name) self.create_environment(env_name)
@ -186,6 +195,7 @@ class TestSuiteEnvironment(base.ApplicationTestCase):
5. Sort rows by name and check it again. 5. Sort rows by name and check it again.
6. Sort rows in other direction and check it again. 6. Sort rows in other direction and check it again.
""" """
self.navigate_to('Applications')
self.go_to_submenu('Environments') self.go_to_submenu('Environments')
self.create_environment('quick-env-1') self.create_environment('quick-env-1')
self.add_app_to_env(self.deployingapp_id) self.add_app_to_env(self.deployingapp_id)
@ -236,12 +246,14 @@ class TestSuiteEnvironment(base.ApplicationTestCase):
6. Check that env status is 'Ready to configure'. 6. Check that env status is 'Ready to configure'.
""" """
self.add_app_to_env(self.mockapp_id) self.add_app_to_env(self.mockapp_id)
self.navigate_to('Applications')
self.go_to_submenu('Environments') self.go_to_submenu('Environments')
self.check_element_on_page(by.By.XPATH, self.check_element_on_page(by.By.XPATH,
c.EnvStatus.format('quick-env-1', c.EnvStatus.format('quick-env-1',
'Ready to deploy')) 'Ready to deploy'))
self.log_out() self.log_out()
self.log_in(cfg.common.user, cfg.common.password) self.log_in(cfg.common.user, cfg.common.password)
self.navigate_to('Applications')
self.go_to_submenu('Environments') self.go_to_submenu('Environments')
self.check_element_on_page(by.By.XPATH, self.check_element_on_page(by.By.XPATH,
c.EnvStatus.format('quick-env-1', c.EnvStatus.format('quick-env-1',
@ -265,6 +277,7 @@ class TestSuiteEnvironment(base.ApplicationTestCase):
self.check_element_on_page(by.By.XPATH, self.check_element_on_page(by.By.XPATH,
c.Status.format('Ready'), c.Status.format('Ready'),
sec=90) sec=90)
self.navigate_to('Applications')
self.go_to_submenu('Environments') self.go_to_submenu('Environments')
self.check_element_on_page(by.By.LINK_TEXT, 'quick-env-1') self.check_element_on_page(by.By.LINK_TEXT, 'quick-env-1')
env_id = self.get_element_id('quick-env-1') env_id = self.get_element_id('quick-env-1')
@ -275,6 +288,7 @@ class TestSuiteEnvironment(base.ApplicationTestCase):
'Ready to deploy')) 'Ready to deploy'))
self.log_out() self.log_out()
self.log_in(cfg.common.user, cfg.common.password) self.log_in(cfg.common.user, cfg.common.password)
self.navigate_to('Applications')
self.go_to_submenu('Environments') self.go_to_submenu('Environments')
self.check_element_on_page(by.By.XPATH, self.check_element_on_page(by.By.XPATH,
c.EnvStatus.format('quick-env-1', c.EnvStatus.format('quick-env-1',
@ -300,12 +314,14 @@ class TestSuiteEnvironment(base.ApplicationTestCase):
sec=90) sec=90)
self.delete_component() self.delete_component()
self.check_element_not_on_page(by.By.LINK_TEXT, 'TestApp') self.check_element_not_on_page(by.By.LINK_TEXT, 'TestApp')
self.navigate_to('Applications')
self.go_to_submenu('Environments') self.go_to_submenu('Environments')
self.check_element_on_page(by.By.XPATH, self.check_element_on_page(by.By.XPATH,
c.EnvStatus.format('quick-env-1', c.EnvStatus.format('quick-env-1',
'Ready to deploy')) 'Ready to deploy'))
self.log_out() self.log_out()
self.log_in(cfg.common.user, cfg.common.password) self.log_in(cfg.common.user, cfg.common.password)
self.navigate_to('Applications')
self.go_to_submenu('Environments') self.go_to_submenu('Environments')
self.check_element_on_page(by.By.XPATH, self.check_element_on_page(by.By.XPATH,
c.EnvStatus.format('quick-env-1', c.EnvStatus.format('quick-env-1',
@ -325,6 +341,7 @@ class TestSuiteEnvironment(base.ApplicationTestCase):
8. Check that env status is 'Ready'. 8. Check that env status is 'Ready'.
""" """
self.add_app_to_env(self.mockapp_id) self.add_app_to_env(self.mockapp_id)
self.navigate_to('Applications')
self.go_to_submenu('Environments') self.go_to_submenu('Environments')
self.check_element_on_page(by.By.LINK_TEXT, 'quick-env-1') self.check_element_on_page(by.By.LINK_TEXT, 'quick-env-1')
env_id = self.get_element_id('quick-env-1') env_id = self.get_element_id('quick-env-1')
@ -340,6 +357,7 @@ class TestSuiteEnvironment(base.ApplicationTestCase):
'Ready to deploy')) 'Ready to deploy'))
self.log_out() self.log_out()
self.log_in(cfg.common.user, cfg.common.password) self.log_in(cfg.common.user, cfg.common.password)
self.navigate_to('Applications')
self.go_to_submenu('Environments') self.go_to_submenu('Environments')
self.check_element_on_page(by.By.XPATH, self.check_element_on_page(by.By.XPATH,
c.EnvStatus.format('quick-env-1', c.EnvStatus.format('quick-env-1',
@ -430,7 +448,8 @@ class TestSuiteFields(base.FieldsTestCase):
12. Set "domain.local" as a domain name and check that 12. Set "domain.local" as a domain name and check that
error message didn't appear error message didn't appear
""" """
self.go_to_submenu('Browse') self.navigate_to('Browse')
self.go_to_submenu('Browse Local')
self.select_and_click_action_for_app('quick-add', self.mockapp_id) self.select_and_click_action_for_app('quick-add', self.mockapp_id)
field_id = self.mockapp_id + "_0-domain" field_id = self.mockapp_id + "_0-domain"
@ -487,7 +506,8 @@ class TestSuiteFields(base.FieldsTestCase):
3. Check a set of names, if current name isn't valid 3. Check a set of names, if current name isn't valid
appropriate error message should appears appropriate error message should appears
""" """
self.go_to_submenu('Browse') self.navigate_to('Browse')
self.go_to_submenu('Browse Local')
self.select_and_click_action_for_app('quick-add', self.mockapp_id) self.select_and_click_action_for_app('quick-add', self.mockapp_id)
@ -518,7 +538,8 @@ class TestSuiteFields(base.FieldsTestCase):
4. Set app name and click 'Next', 4. Set app name and click 'Next',
check that there is no error message check that there is no error message
""" """
self.go_to_submenu('Browse') self.navigate_to('Browse')
self.go_to_submenu('Browse Local')
self.select_and_click_action_for_app('quick-add', self.mockapp_id) self.select_and_click_action_for_app('quick-add', self.mockapp_id)
@ -542,7 +563,8 @@ class TestSuiteFields(base.FieldsTestCase):
field, check that validation failed field, check that validation failed
5. Set correct password. Validation has to pass 5. Set correct password. Validation has to pass
""" """
self.go_to_submenu('Browse') self.navigate_to('Browse')
self.go_to_submenu('Browse Local')
self.select_and_click_action_for_app('quick-add', self.mockapp_id) self.select_and_click_action_for_app('quick-add', self.mockapp_id)
@ -569,7 +591,8 @@ class TestSuiteApplications(base.ApplicationTestCase):
will appear will appear
4. Click 'Back' and check that first wizard step is shown 4. Click 'Back' and check that first wizard step is shown
""" """
self.go_to_submenu('Browse') self.navigate_to('Browse')
self.go_to_submenu('Browse Local')
self.select_and_click_action_for_app('quick-add', self.mockapp_id) self.select_and_click_action_for_app('quick-add', self.mockapp_id)
@ -594,7 +617,8 @@ class TestSuiteApplications(base.ApplicationTestCase):
4. Click '+' and verify that creation of second app is possible 4. Click '+' and verify that creation of second app is possible
""" """
self.go_to_submenu('Browse') self.navigate_to('Browse')
self.go_to_submenu('Browse Local')
self.select_and_click_action_for_app('quick-add', self.mockapp_id) self.select_and_click_action_for_app('quick-add', self.mockapp_id)
@ -615,7 +639,8 @@ class TestSuiteApplications(base.ApplicationTestCase):
4. Delete TestApp app from environment 4. Delete TestApp app from environment
""" """
self.go_to_submenu('Browse') self.navigate_to('Browse')
self.go_to_submenu('Browse Local')
self.select_and_click_action_for_app('quick-add', self.mockapp_id) self.select_and_click_action_for_app('quick-add', self.mockapp_id)
@ -639,7 +664,8 @@ class TestSuiteApplications(base.ApplicationTestCase):
2. Set search criterion in the search field(e.g 'PostgreSQL') 2. Set search criterion in the search field(e.g 'PostgreSQL')
3. Click on 'Filter' and check result 3. Click on 'Filter' and check result
""" """
self.go_to_submenu('Browse') self.navigate_to('Browse')
self.go_to_submenu('Browse Local')
self.fill_field(by.By.CSS_SELECTOR, 'input.form-control', 'PostgreSQL') self.fill_field(by.By.CSS_SELECTOR, 'input.form-control', 'PostgreSQL')
self.driver.find_element_by_id('apps__action_filter').click() self.driver.find_element_by_id('apps__action_filter').click()
@ -661,7 +687,8 @@ class TestSuiteApplications(base.ApplicationTestCase):
4. Select 'Web' category in 'App Category' dropdown menu 4. Select 'Web' category in 'App Category' dropdown menu
5. Verify that MockApp is shown 5. Verify that MockApp is shown
""" """
self.go_to_submenu('Browse') self.navigate_to('Browse')
self.go_to_submenu('Browse Local')
self.driver.find_element_by_xpath( self.driver.find_element_by_xpath(
c.CategorySelector.format('All')).click() c.CategorySelector.format('All')).click()
self.driver.find_element_by_partial_link_text('Databases').click() self.driver.find_element_by_partial_link_text('Databases').click()
@ -689,6 +716,7 @@ class TestSuiteApplications(base.ApplicationTestCase):
and go to the env2 and go to the env2
9. Check that added application is here 9. Check that added application is here
""" """
self.navigate_to('Applications')
self.go_to_submenu('Environments') self.go_to_submenu('Environments')
self.create_environment('env1') self.create_environment('env1')
self.go_to_submenu('Environments') self.go_to_submenu('Environments')
@ -699,7 +727,8 @@ class TestSuiteApplications(base.ApplicationTestCase):
env_id = self.get_element_id('env2') env_id = self.get_element_id('env2')
self.go_to_submenu('Browse') self.navigate_to('Browse')
self.go_to_submenu('Browse Local')
self.driver.find_element_by_xpath( self.driver.find_element_by_xpath(
".//*[@id='environment_switcher']/a").click() ".//*[@id='environment_switcher']/a").click()
@ -729,7 +758,8 @@ class TestSuiteApplications(base.ApplicationTestCase):
3. Click deploy 3. Click deploy
4. Check that for "Deploying" status progress bar is seen 4. Check that for "Deploying" status progress bar is seen
""" """
self.go_to_submenu('Browse') self.navigate_to('Browse')
self.go_to_submenu('Browse Local')
self.select_and_click_action_for_app('quick-add', self.mockapp_id) self.select_and_click_action_for_app('quick-add', self.mockapp_id)
field_id = "{0}_0-name".format(self.mockapp_id) field_id = "{0}_0-name".format(self.mockapp_id)
self.fill_field(by.By.ID, field_id, value='TestApp') self.fill_field(by.By.ID, field_id, value='TestApp')
@ -795,7 +825,8 @@ class TestSuiteApplications(base.ApplicationTestCase):
2. Choose some application and click on 'More info' 2. Choose some application and click on 'More info'
3. Verify info about application 3. Verify info about application
""" """
self.go_to_submenu('Browse') self.navigate_to('Browse')
self.go_to_submenu('Browse Local')
self.select_and_click_action_for_app('details', self.mockapp_id) self.select_and_click_action_for_app('details', self.mockapp_id)
self.assertEqual('MockApp for webUI tests', self.assertEqual('MockApp for webUI tests',
@ -902,7 +933,8 @@ class TestSuiteApplications(base.ApplicationTestCase):
2. Check for YAQL validator 2. Check for YAQL validator
3. Check that app is added to the environment 3. Check that app is added to the environment
""" """
self.go_to_submenu('Browse') self.navigate_to('Browse')
self.go_to_submenu('Browse Local')
self.select_and_click_action_for_app('quick-add', self.hot_app_id) self.select_and_click_action_for_app('quick-add', self.hot_app_id)
field_id = "{0}_0-name".format(self.hot_app_id) field_id = "{0}_0-name".format(self.hot_app_id)
self.fill_field(by.By.ID, field_id, value='TestHotApp') self.fill_field(by.By.ID, field_id, value='TestHotApp')
@ -945,6 +977,7 @@ class TestSuiteApplications(base.ApplicationTestCase):
# In case of application some short name is needed to fit on page # In case of application some short name is needed to fit on page
app_names.append(str(uuid.uuid4())[::4]) app_names.append(str(uuid.uuid4())[::4])
self.navigate_to('Applications')
self.go_to_submenu('Environments') self.go_to_submenu('Environments')
self.create_environment(env_name) self.create_environment(env_name)
self.go_to_submenu('Environments') self.go_to_submenu('Environments')
@ -953,7 +986,8 @@ class TestSuiteApplications(base.ApplicationTestCase):
for idx, app_name in enumerate(app_names): for idx, app_name in enumerate(app_names):
# Add application to the environment # Add application to the environment
self.go_to_submenu('Browse') self.navigate_to('Browse')
self.go_to_submenu('Browse Local')
self.select_and_click_action_for_app( self.select_and_click_action_for_app(
'add', '{0}/{1}'.format(self.mockapp_id, env_id)) 'add', '{0}/{1}'.format(self.mockapp_id, env_id))
self.fill_field(by.By.NAME, self.fill_field(by.By.NAME,
@ -1008,6 +1042,7 @@ class TestSuiteApplications(base.ApplicationTestCase):
# In case of application some short name is needed to fit on page # In case of application some short name is needed to fit on page
app_names.append(str(uuid.uuid4())[::4]) app_names.append(str(uuid.uuid4())[::4])
self.navigate_to('Applications')
self.go_to_submenu('Environments') self.go_to_submenu('Environments')
self.create_environment(env_name) self.create_environment(env_name)
self.go_to_submenu('Environments') self.go_to_submenu('Environments')
@ -1016,7 +1051,8 @@ class TestSuiteApplications(base.ApplicationTestCase):
for idx, app_name in enumerate(app_names, 1): for idx, app_name in enumerate(app_names, 1):
# Add application to the environment # Add application to the environment
self.go_to_submenu('Browse') self.navigate_to('Browse')
self.go_to_submenu('Browse Local')
self.select_and_click_action_for_app( self.select_and_click_action_for_app(
'add', '{0}/{1}'.format(self.mockapp_id, env_id)) 'add', '{0}/{1}'.format(self.mockapp_id, env_id))
self.fill_field(by.By.NAME, self.fill_field(by.By.NAME,
@ -1085,8 +1121,8 @@ class TestSuiteAppsPagination(base.UITestCase):
def test_apps_pagination(self): def test_apps_pagination(self):
"""Test check pagination in case of many applications installed.""" """Test check pagination in case of many applications installed."""
self.navigate_to('Catalog') self.navigate_to('Browse')
self.go_to_submenu('Browse') self.go_to_submenu('Browse Local')
packages_list = [elem.name for elem in packages_list = [elem.name for elem in
self.murano_client.packages.list()] self.murano_client.packages.list()]
# No list of apps available in the client only packages are. # No list of apps available in the client only packages are.
@ -1181,8 +1217,8 @@ class TestSuitePackages(base.PackageTestCase):
self.fill_field(by.By.ID, 'id_tags', 'TEST_TAG') self.fill_field(by.By.ID, 'id_tags', 'TEST_TAG')
self.modify_package('tags', 'TEST_TAG') self.modify_package('tags', 'TEST_TAG')
self.navigate_to('Catalog') self.navigate_to('Browse')
self.go_to_submenu('Browse') self.go_to_submenu('Browse Local')
self.select_and_click_action_for_app('details', self.postgre_id) self.select_and_click_action_for_app('details', self.postgre_id)
self.assertIn('TEST_TAG', self.assertIn('TEST_TAG',
self.driver.find_element_by_xpath( self.driver.find_element_by_xpath(
@ -1225,8 +1261,8 @@ class TestSuitePackages(base.PackageTestCase):
self.wait_for_alert_message() self.wait_for_alert_message()
self.check_package_parameter_by_id(self.postgre_id, 'Active', 'False') self.check_package_parameter_by_id(self.postgre_id, 'Active', 'False')
self.navigate_to('Catalog') self.navigate_to('Browse')
self.go_to_submenu('Browse') self.go_to_submenu('Browse Local')
# 'Quick Deploy' button contains id of the application. # 'Quick Deploy' button contains id of the application.
# So it is possible to definitely determinate is it in catalog or not. # So it is possible to definitely determinate is it in catalog or not.
btn_xpath = ("//*[@href='{0}/app-catalog/catalog/quick-add/{1}']" btn_xpath = ("//*[@href='{0}/app-catalog/catalog/quick-add/{1}']"
@ -1243,8 +1279,8 @@ class TestSuitePackages(base.PackageTestCase):
self.check_package_parameter_by_id(self.postgre_id, 'Active', 'True') self.check_package_parameter_by_id(self.postgre_id, 'Active', 'True')
self.navigate_to('Catalog') self.navigate_to('Browse')
self.go_to_submenu('Browse') self.go_to_submenu('Browse Local')
self.check_element_on_page(by.By.XPATH, btn_xpath) self.check_element_on_page(by.By.XPATH, btn_xpath)
def test_check_toggle_public_package(self): def test_check_toggle_public_package(self):
@ -1282,8 +1318,8 @@ class TestSuitePackages(base.PackageTestCase):
# Check that application is available in other project. # Check that application is available in other project.
self.switch_to_project(new_project) self.switch_to_project(new_project)
self.navigate_to('Catalog') self.navigate_to('Browse')
self.go_to_submenu('Browse') self.go_to_submenu('Browse Local')
# 'Quick Deploy' button contains id of the application. # 'Quick Deploy' button contains id of the application.
# So it is possible to definitely determine is it in catalog or not. # So it is possible to definitely determine is it in catalog or not.
btn_xpath = ("//*[@href='{0}/app-catalog/catalog/quick-add/{1}']" btn_xpath = ("//*[@href='{0}/app-catalog/catalog/quick-add/{1}']"
@ -1304,8 +1340,8 @@ class TestSuitePackages(base.PackageTestCase):
# Check that application now is not available in other porject. # Check that application now is not available in other porject.
self.switch_to_project(new_project) self.switch_to_project(new_project)
self.navigate_to('Catalog') self.navigate_to('Browse')
self.go_to_submenu('Browse') self.go_to_submenu('Browse Local')
self.check_element_not_on_page(by.By.XPATH, btn_xpath) self.check_element_not_on_page(by.By.XPATH, btn_xpath)
def test_modify_description(self): def test_modify_description(self):
@ -1323,8 +1359,8 @@ class TestSuitePackages(base.PackageTestCase):
self.modify_package('description', 'New Description') self.modify_package('description', 'New Description')
self.navigate_to('Catalog') self.navigate_to('Browse')
self.go_to_submenu('Browse') self.go_to_submenu('Browse Local')
self.assertEqual('New Description', self.assertEqual('New Description',
self.driver.find_element_by_xpath( self.driver.find_element_by_xpath(
c.MockAppDescr).text) c.MockAppDescr).text)
@ -2237,8 +2273,8 @@ class TestSuitePackageCategory(base.PackageTestCase):
9. Select new category in "App category" dropdown list 9. Select new category in "App category" dropdown list
""" """
self._import_package_with_category(self.archive, self.category) self._import_package_with_category(self.archive, self.category)
self.navigate_to('Catalog') self.navigate_to('Browse')
self.go_to_submenu('Browse') self.go_to_submenu('Browse Local')
self.driver.find_element_by_xpath( self.driver.find_element_by_xpath(
c.CategorySelector.format('All')).click() c.CategorySelector.format('All')).click()
self.driver.find_element_by_partial_link_text(self.category).click() self.driver.find_element_by_partial_link_text(self.category).click()
@ -2269,7 +2305,7 @@ class TestSuitePackageCategory(base.PackageTestCase):
# create environment # create environment
env_name = str(uuid.uuid4()) env_name = str(uuid.uuid4())
self.navigate_to('Catalog') self.navigate_to('Applications')
self.go_to_submenu('Environments') self.go_to_submenu('Environments')
self.create_environment(env_name) self.create_environment(env_name)
self.go_to_submenu('Environments') self.go_to_submenu('Environments')
@ -2417,6 +2453,7 @@ class TestSuiteMultipleEnvironments(base.ApplicationTestCase):
3. Check created environments 3. Check created environments
4. Delete created environments at once 4. Delete created environments at once
""" """
self.navigate_to('Applications')
self.go_to_submenu('Environments') self.go_to_submenu('Environments')
self.create_environment('test_create_del_env_1') self.create_environment('test_create_del_env_1')
self.go_to_submenu('Environments') self.go_to_submenu('Environments')
@ -2444,6 +2481,7 @@ class TestSuiteMultipleEnvironments(base.ApplicationTestCase):
""" """
self.add_app_to_env(self.mockapp_id) self.add_app_to_env(self.mockapp_id)
self.add_app_to_env(self.mockapp_id) self.add_app_to_env(self.mockapp_id)
self.navigate_to('Applications')
self.go_to_submenu('Environments') self.go_to_submenu('Environments')
self.driver.find_element_by_css_selector( self.driver.find_element_by_css_selector(
"label[for=ui-id-1]").click() "label[for=ui-id-1]").click()
@ -2469,6 +2507,7 @@ class TestSuiteMultipleEnvironments(base.ApplicationTestCase):
""" """
self.add_app_to_env(self.deployingapp_id) self.add_app_to_env(self.deployingapp_id)
self.add_app_to_env(self.deployingapp_id) self.add_app_to_env(self.deployingapp_id)
self.navigate_to('Applications')
self.go_to_submenu('Environments') self.go_to_submenu('Environments')
self.driver.find_element_by_css_selector( self.driver.find_element_by_css_selector(
"label[for=ui-id-1]").click() "label[for=ui-id-1]").click()
@ -2498,6 +2537,7 @@ class TestSuiteMultipleEnvironments(base.ApplicationTestCase):
5. Check that "Abandon Environments" button is only clickable 5. Check that "Abandon Environments" button is only clickable
if env with status "Ready", "Deploying" are checked if env with status "Ready", "Deploying" are checked
""" """
self.navigate_to('Applications')
self.go_to_submenu('Environments') self.go_to_submenu('Environments')
self.create_environment('quick-env-1') self.create_environment('quick-env-1')
self.go_to_submenu('Environments') self.go_to_submenu('Environments')

View File

@ -0,0 +1,16 @@
---
prelude: >
Murano Dashboard has been renamed to App Catalog and now allows
seamless integration and single panel structure
with App Catalog UI dashboard.
features:
- Murano dashboard has been renamed to App Catalog,
monolithic config file has been split into multiple small files.
Every such file defines either a panel group or adds
general murano-related settings to horizon.
upgrade:
- To upgrade to Newton version of app catalog you need to remove old
``_50_murano.py`` config file, that defined in murano dashboard. Be sure to
also remove any .pyc and .po files. After that you need to copy all new
config files from ``muranodashboard/local/enabled/*.py`` to
``openstack_dashboard/local/enabled/`` and restart horizon