Add tests for component registry suite for vCenter

With component registry mechanism plugins can set compatibility,
incompatibility and requires between components.

Current tests implement automatization to verify UI representation of
components relations. They have to be run regularly on CI.

To run tests you need to export variables PLUGIN_RPM (path to
example-plugin rpm) and VENV (path to virtual env). Run with
`npm run component-tests`.

Closes-Bug: #1597710
Change-Id: I5d929da714a4c44515094df4e6edd3a7d93f4aa0
This commit is contained in:
Ekaterina Khomyakova 2016-06-30 13:38:44 +03:00 committed by ekhomyakova
parent 5684d7460e
commit 07eab5f5a6
31 changed files with 1442 additions and 1 deletions

View File

@ -17,7 +17,8 @@
"test": "npm run unit-tests && npm run func-tests",
"unit-tests": "gulp unit-tests",
"func-tests": "./run_ui_func_tests.sh",
"nightly-func-tests": "./run_ui_func_tests.sh static/tests/functional/nightly/*.js"
"nightly-func-tests": "./run_ui_func_tests.sh static/tests/functional/nightly/*.js",
"component-tests": "./run_component_registry_tests.sh"
},
"dependencies": {
"async-props": "0.3.2",

127
run_component_registry_tests.sh Executable file
View File

@ -0,0 +1,127 @@
#!/bin/bash
# Copyright 2016 Mirantis, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
set -eu
# Variables for tests
export NO_NAILGUN_START=${NO_NAILGUN_START:-0}
export TEST_PREFIX=${TEST_PREFIX:-'test_*'}
export FUEL_WEB_ROOT=$(readlink -f ${FUEL_WEB_ROOT:-"$(dirname $0)/../fuel-web"})
export ARTIFACTS=${ARTIFACTS:-"$(pwd)/test_run/ui_component"}
export CONF_PATH="$(pwd)/static/tests/functional/component_registry/plugin_conf"
export SCRIPT_PATH="${CONF_PATH}/update_components.sh"
export PLUGIN_RPM=${PLUGIN_RPM:-''}
if [ -z "${PLUGIN_RPM}" ]; then
plugins='https://product-ci.infra.mirantis.net/view/All/job/9.0.build-fuel-plugins'
path='lastSuccessfulBuild/artifact/built_plugins/fuel_plugin_example_v4-4.0-4.0.0-1.noarch.rpm'
plugin_url=${PLUGIN_URL:-"${plugins}/${path}"}
export PLUGIN_RPM="${CONF_PATH}/plugin.rpm"
wget -O "${PLUGIN_RPM}" "${plugin_url}"
fi
# Variables for nailgun
export NAILGUN_PORT=${NAILGUN_PORT:-5544}
export NAILGUN_START_MAX_WAIT_TIME=${NAILGUN_START_MAX_WAIT_TIME:-30}
export NAILGUN_DB_HOST=${NAILGUN_DB_HOST:-/var/run/postgresql}
export NAILGUN_DB=${NAILGUN_DB:-nailgun}
export NAILGUN_DB_USER=${NAILGUN_DB_USER:-nailgun}
export NAILGUN_DB_USERPW=${NAILGUN_DB_USERPW:-nailgun}
export DB_ROOT=${DB_ROOT:-postgres}
export NAILGUN_ROOT=$FUEL_WEB_ROOT/nailgun
export NAILGUN_STATIC=$ARTIFACTS/static
export NAILGUN_TEMPLATES=$NAILGUN_STATIC
export NAILGUN_CHECK_URL='/api/version'
mkdir -p "$ARTIFACTS"
function install_plugin {
plugin_rpm=$1
mkdir -p "${nailgun_plugins_path}"
local plugin_dir=$(sudo alien -i "${plugin_rpm}" | grep -oP 'Setting up \K[^ ]*')
export PLUGIN_PATH=$(echo ${nailgun_plugins_path}/${plugin_dir//[-_]/\*})
meta=${PLUGIN_PATH}/metadata.yaml
plugin_name=$(grep -oP '^name: \K(.*)' "${meta}")
plugin_version=$(grep -oP '^version: \K(.*)' "${meta}")
sudo sed -i -e "s/fuel_version: \['8.0'\]/fuel_version: \['10.0'\]/" "${meta}"
sudo sed -i -e "s/fuel_version: \['9.0'\]/fuel_version: \['10.0'\]/" "${meta}"
sudo sed -i -e "s/mitaka-9.0/newton-10.0/" "${meta}"
fuel --os-username admin --os-password admin plugins \
--register "${plugin_name}==${plugin_version//\'/}"
}
function remove_plugin {
fuel --os-username admin --os-password admin plugins \
--remove "${plugin_name}==${plugin_version//\'/}" 2>/dev/null || \
echo "${plugin_name} was removed"
}
function run_component_tests {
local GULP='./node_modules/.bin/gulp'
local TESTS_DIR='static/tests/functional/component_registry'
local TESTS=$TESTS_DIR/${TEST_PREFIX}.js
local result=0
export SERVER_ADDRESS=${SERVER_ADDRESS:-'127.0.0.1'}
export SERVER_PORT=${NAILGUN_PORT}
export nailgun_plugins_path='/var/www/nailgun/plugins'
pip install python-fuelclient
fuelclient="${VENV}/lib/python2.7/site-packages/fuelclient"
sed -i -e "s/if self.auth_required/if True/" "${fuelclient}/client.py"
echo "Building tests..."
${GULP} intern:transpile
if [ "${NO_NAILGUN_START}" -ne 1 ]; then
pushd "$FUEL_WEB_ROOT" > /dev/null
tox -e stop
tox -e cleanup
tox -e start
popd > /dev/null
fi
${GULP} build --no-sourcemaps --extra-entries=sinon --static-dir="$NAILGUN_STATIC"
if [ $? -ne 0 ]; then
return 1
fi
install_plugin "${PLUGIN_RPM}"
for test_case in $TESTS; do
echo "INFO: Running test case ${test_case}"
ARTIFACTS=$ARTIFACTS \
${GULP} functional-tests --no-transpile --suites="${test_case}" || result=1
done
remove_plugin
if [ "${NO_NAILGUN_START}" -ne 1 ]; then
pushd "$FUEL_WEB_ROOT" > /dev/null
tox -e stop
popd > /dev/null
fi
return $result
}
run_component_tests

View File

@ -0,0 +1,59 @@
/*
* Copyright 2016 Mirantis, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may obtain
* a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
**/
import _ from 'intern/dojo/node!lodash';
import childProcess from 'intern/dojo/node!child_process';
import Command from 'intern/dojo/node!leadfoot/Command';
import 'tests/functional/helpers';
_.defaults(Command.prototype, {
updatePlugin(files) {
return new this.constructor(this, function() {
return this.parent
.then(() => {
childProcess.exec('/bin/sh ${SCRIPT_PATH} ' + files,
(err) => {
if (err) return;
});
})
.sleep(250); // wait for plugin update
});
},
newClusterFillName(modal) {
return new this.constructor(this, function() {
return this.parent
.clickByCssSelector('.create-cluster')
.then(() => modal.waitToOpen())
.setInputValue('[name=name]', 'Temp');
});
},
assertNextButtonEnabled() {
return new this.constructor(this, function() {
return this.parent
.assertElementNotExists('button.next-pane-btn.disabled',
'Next button is disabled');
});
},
deleteCluster(modal) {
return new this.constructor(this, function() {
return this.parent
.clickByCssSelector('button.delete-environment-btn')
.then(() => modal.waitToOpen())
.clickByCssSelector('button.remove-cluster-btn')
.then(() => modal.waitToClose());
});
}
});

View File

@ -0,0 +1,12 @@
- name: 'network:neutron:contrail'
label: 'Contrail'
description: 'Contrail SDN networking'
bind: !!pairs
- "cluster:net_provider": "neutron"
- "cluster:net_segment_type": "tun"
compatible:
- name: 'hypervisor:kvm'
- name: 'hypervisor:qemu'
incompatible:
- name: 'hypervisor:vmware'
description: 'Contrail plugin is not compatible with VMware for now'

View File

@ -0,0 +1,11 @@
- name: 'network:neutron:ml2:dvs'
label: 'Neutron with VMware DVS'
description: 'Neutron with VMware DVS ML2 plugin'
requires:
- name: 'network:neutron:core:ml2'
- name: 'hypervisor:vmware'
message: 'The VMware DVS plugin requires vCenter as the hypervisor option.'
compatible:
- name: 'hypervisor:*'
- name: 'network:neutron:ml2:vlan'
- name: 'network:neutron:core:ml2'

View File

@ -0,0 +1,21 @@
- name: "network:neutron:core:nsx"
label: "Neutron with NSXv plugin."
description: "NSXv plugin for Fuel allows to integrate Mirantis OpenStack with VMware NSXv network virtualization platform."
bind: !!pairs
- "cluster:net_segment_type": "tun"
compatible:
- name: "hypervisor:vmware"
- name: "hypervisor:qemu"
- name: "storage:block:lvm"
- name: "storage:image:ceph"
- name: "storage:object:ceph"
- name: "additional_service:ceilometer"
incompatible:
- name: "storage:block:ceph"
- name: "storage:ephemeral:ceph"
- name: "additional_service:sahara"
- name: "additional_service:murano"
- name: "additional_service:ironic"
requires:
- name: "hypervisor:vmware"
message: "NSXv requires use vCenter."

View File

@ -0,0 +1,16 @@
- name: 'additional_service:smile'
label: 'smile'
description: 'smile'
incompatible:
- name: 'network:nova_network'
requires:
- name: 'hypervisor:vmware'
- name: 'network:neutron:ml2:dvs'
compatible:
- name: 'additional_service:sahara'
- name: 'network:neutron:ml2:dvs'
label: 'dvs'
description: 'dvs'
- name: 'network:nova_network'
label: 'Nova network'

View File

@ -0,0 +1,9 @@
- name: 'additional_service:smile'
label: 'smile'
description: 'smile'
incompatible:
- name: 'additional_service:ceilometer'
requires:
- name: 'additional_service:murano'
compatible:
- name: 'additional_service:sahara'

View File

@ -0,0 +1,9 @@
- name: 'additional_service:smile'
label: 'smile'
description: 'smile'
incompatible:
- name: 'additional_service:ironic'
requires:
- name: 'additional_service:sahara'
compatible:
- name: 'additional_service:murano'

View File

@ -0,0 +1,12 @@
- name: 'additional_service:smile'
label: 'smile'
description: 'smile'
incompatible:
- name: 'network:neutron:ml2:tun'
- name: 'hypervisor:vmware'
requires:
- name: 'additional_service:sahara'
compatible:
- name: 'storage:block:ceph'
- name: 'network:neutron:ml2:dvs'
label: 'DVS network'

View File

@ -0,0 +1,13 @@
- name: 'network:neutron:core:nsx'
label: 'Neutron with NSXv plugin.'
description: 'NSXv plugin for Fuel allows to integrate Mirantis OpenStack with VMware NSXv network virtualization platform.'
bind: !!pairs
- 'cluster:net_segment_type': 'tun'
compatible:
- name: 'hypervisor:vmware'
- name: 'hypervisor:kvm'
- name: 'hypervisor:qemu'
- name: 'storage:block:lvm'
requires:
- name: 'hypervisor:vmware'
message: 'NSXv requires the usage of vCenter.'

View File

@ -0,0 +1,11 @@
- name: 'network:neutron:core:nsx'
label: 'Neutron with NSXv plugin.'
description: 'NSXv plugin for Fuel allows to integrate Mirantis OpenStack with VMware NSXv network virtualization platform.'
bind: !!pairs
- 'cluster:net_segment_type': 'tun'
compatible:
- name: 'hypervisor:vmware'
- name: 'storage:block:lvm'
requires:
- name: 'hypervisor:vmware'
message: 'NSXv requires the usage of vCenter.'

View File

@ -0,0 +1,8 @@
- name: 'hypervisor:libvirt:rain'
label: 'rain'
description: 'rain hypervisor'
incompatible:
- name: 'hypervisor:xen'
- name: 'hypervisor:xen'
label: 'xen'
description: 'xen hypervisor'

View File

@ -0,0 +1,9 @@
- name: 'hypervisor:libvirt:rain1'
label: 'rain'
description: 'rain hypervisor'
incompatible:
- name: 'hypervisor:qemu'
- name: 'hypervisor:xen'
- name: 'hypervisor:xen'
label: 'xen'
description: 'xen hypervisor'

View File

@ -0,0 +1,5 @@
- name: 'hypervisor:libvirt:sun'
label: 'sun'
description: 'sun hypervisor'
incompatible:
- name: 'hypervisor:qemu'

View File

@ -0,0 +1,9 @@
- name: 'hypervisor:xen'
label: 'xen'
description: 'hypervisor:xen'
requires:
- name: 'hypervisor:qemu'
incompatible:
- name: 'hypervisor:vmware'
description: 'xen not compatible with vmware'

View File

@ -0,0 +1,14 @@
- name: 'hypervisor:xen'
label: 'xen'
description: 'xen'
requires:
- name: 'additional_service:murano'
compatible:
- name: 'additional_service:ceilometer'
incompatible:
- name: 'hypervisor:test:*'
- name: 'hypervisor:test:sun'
label: 'sun'
- name: 'hypervisor:test:rain'
label: 'rain'

View File

@ -0,0 +1,13 @@
- name: 'network:neutron:contrail'
label: 'Contrail'
description: 'Contrail SDN networking'
bind: !!pairs
- 'cluster:net_provider': 'neutron'
- 'cluster:net_segment_type': 'tun'
compatible:
- name: 'hypervisor:*'
incompatible:
- name: 'hypervisor:vmware'
description: 'Contrail is not compatible with VMware for now'
- name: 'network:neutron:ml2:dvs'
description: 'Contrail is not compatible with VMware for now'

View File

@ -0,0 +1,8 @@
- name: 'network:neutron:ml2:dvs'
label: 'DVS network'
description: 'DVS network type'
requires:
- name: 'network:neutron:core:ml2'
- name: 'hypervisor:vmware'
incompatible:
- name: 'network:neutron:core:contrail'

View File

@ -0,0 +1,25 @@
- name: 'network:neutron:ml2:dvs'
label: 'DVS network'
description: 'DVS network type'
requires:
- name: 'network:neutron:core:ml2'
- name: 'hypervisor:vmware'
- name: 'network:neutron:ml2:frog'
label: 'frog'
description: 'frog'
incompatible:
- name: 'network:neutron:ml2:tun'
- name: 'storage:ephemeral:ceph'
requires:
- name: 'additional_service:sahara'
- name: 'network:neutron:core:ml2'
compatible:
- name: 'network:neutron:ml2:dvs'
- name: 'storage:block:ceph'
- name: 'hypervisor:libvirt:qemu'
- name: 'additional_service:murano'
- name: 'hypervisor:xen'
label: 'Xen'
description: 'Xen hypervisor'
incompatible:
- name: 'hypervisor:vmware'

View File

@ -0,0 +1,14 @@
- name: 'storage:block:nfs'
label: 'nfs'
description: 'nfs'
incompatible:
- name: 'storage:object:sheepdog'
message: 'not compatible with sheepdog'
- name: 'storage:object:cat'
message: 'not compatible with cat'
- name: 'storage:object:sheepdog'
label: 'sheepdog'
description: 'sheepdog'
- name: 'storage:object:cat'
label: 'cat'
description: 'cat'

View File

@ -0,0 +1,8 @@
- name: 'storage:block:zfs'
label: 'zfs'
description: 'zfs'
incompatible:
- name: 'storage:image:nfs'
- name: 'storage:image:nfs'
label: 'nfs'
description: 'nfs'

View File

@ -0,0 +1,5 @@
- name: 'storage:image:swift'
label: 'swift'
description: 'swift'
incompatible:
- name: 'storage:image:ceph'

View File

@ -0,0 +1,10 @@
- name: 'storage:image:swift'
label: 'swift'
description: 'swift'
incompatible:
- name: 'storage:image:ceph'
compatible:
- name: 'storage:image:cat'
- name: 'storage:image:cat'
label: 'cat'
description: 'cat'

View File

@ -0,0 +1,5 @@
- name: 'storage:object:cat'
label: 'Stor ceph'
description: 'stor ceph'
incompatible:
- name: 'storage:block:lvm'

View File

@ -0,0 +1,8 @@
#!/usr/bin/env bash
default=${CONF_PATH}/$1.yaml
components_file=${CONF_PATH}/$2.yaml
sudo sh -c "cat ${components_file} ${default} > ${PLUGIN_PATH}/components.yaml"
fuel --os-username admin --os-password admin plugins --sync

View File

@ -0,0 +1,207 @@
/*
* Copyright 2016 Mirantis, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may obtain
* a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
**/
import registerSuite from 'intern!object';
import Common from 'tests/functional/pages/common';
import Modal from 'tests/functional/pages/modal';
import 'tests/functional/helpers';
import 'tests/functional/component_registry/component_helpers';
registerSuite(() => {
var common, modal;
return {
name: 'Additional components',
setup() {
common = new Common(this.remote);
modal = new Modal(this.remote);
return this.remote
.then(() => common.getIn());
},
afterEach() {
return this.remote
.pressKeys('\uE007') // Create
.then(() => modal.waitToClose())
// Delete created environment
.deleteCluster(modal)
.catch(() => modal.close().then(() => modal.waitToClose()));
},
'Test additional, -network, !vmware, !dvs, +Sahara'() {
var smile = 'input[value=additional_service\\:smile]';
var ml2 = 'input[value=network\\:neutron\\:core\\:ml2]';
var vlan = 'input[value=network\\:neutron\\:ml2\\:vlan]';
return this.remote
.updatePlugin('dvs_default test_addit_smile')
.newClusterFillName(modal)
.pressKeys('\uE007') // go to Compute
.clickByCssSelector('input[value=hypervisor\\:vmware]')
.assertNextButtonEnabled()
.pressKeys('\uE007') // Networking
//Check that smile is disabled when Nova network is enabled
.clickByCssSelector('input[value=network\\:nova_network]')
.assertNextButtonEnabled()
.pressKeys('\uE007') // Storage
.pressKeys('\uE007') // Additional Services
.assertElementDisabled(smile, 'Smile checkbox is enabled with Nova network')
.clickByCssSelector('button.prev-pane-btn') // back to Storage
.clickByCssSelector('button.prev-pane-btn') // back to Networking
// Check that smile is disabled when dvs network is disabled
.clickByCssSelector(ml2)
.clickByCssSelector(vlan)
.assertNextButtonEnabled()
.pressKeys('\uE007') // Storage
.pressKeys('\uE007') // Additional Services
.assertElementDisabled(smile, 'Smile checkbox is enabled without dvs network')
.clickByCssSelector('button.prev-pane-btn') // back to Storage
.clickByCssSelector('button.prev-pane-btn') // back to Networking
// Create cluster with vCenter + Neutron with ML2 plugin + dvs + Sahara + smile
.clickByCssSelector(ml2)
.clickByCssSelector(vlan)
.clickByCssSelector('input[value=network\\:neutron\\:ml2\\:dvs]')
.assertNextButtonEnabled()
.pressKeys('\uE007') // Storage
.pressKeys('\uE007') // Additional Services
.clickByCssSelector('input[value=additional_service\\:sahara]')
.clickByCssSelector(smile)
.pressKeys('\uE007'); // Finish
},
'Test additional, -Ceilometer, !Murano, +Sahara'() {
var smile = 'input[value=additional_service\\:smile]';
var ceilometer = 'input[value=additional_service\\:ceilometer]';
return this.remote
.updatePlugin('dvs_default test_addit_smile_ceil')
.newClusterFillName(modal)
.pressKeys('\uE007') // go to Compute
.assertNextButtonEnabled()
.pressKeys('\uE007') // Networking
.assertNextButtonEnabled()
.pressKeys('\uE007') // Storage
.pressKeys('\uE007') // Additional Services
// Check that smile is disabled when Murano is not enabled (by default)
.assertElementDisabled(smile, 'Smile is enabled without Murano')
// Check that smile is not compatible with Ceilometer
.clickByCssSelector('input[value=additional_service\\:murano]') // enable required Murano
.clickByCssSelector(ceilometer)
.assertElementDisabled(smile, 'Smile is enabled with Ceilometer')
.clickByCssSelector(ceilometer) // disable Ceilometer
.clickByCssSelector(smile)
.assertElementDisabled(ceilometer, 'Ceilometer is enabled with smile')
.assertElementsExist('i.tooltip-icon.glyphicon-warning-sign' +
'[data-original-title="Not compatible with smile"]', 1,
'No warning that Ceilometer is not compatible with smile')
// Create cluster with smile + murano
.pressKeys('\uE007'); // Finish
},
'Test additional, -Ironic, !Sahara, +Murano'() {
var smile = 'input[value=additional_service\\:smile]';
var ironic = 'input[value=additional_service\\:ironic]';
return this.remote
.updatePlugin('dvs_default test_addit_smile_ironic')
.newClusterFillName(modal)
.pressKeys('\uE007') // go to Compute
.assertNextButtonEnabled()
.pressKeys('\uE007') // Networking
.assertNextButtonEnabled()
.pressKeys('\uE007') // Storage
.pressKeys('\uE007') // Additional Services
// Check that smile is disabled when Sahara is not enabled (by default)
.assertElementDisabled(smile, 'Smile is enabled without Sahara')
// Check that smile is not compatible with Ironic
.clickByCssSelector('input[value=additional_service\\:sahara]') // enable required Sahara
.clickByCssSelector(ironic)
.assertElementDisabled(smile, 'Smile is enabled with Ironic')
.clickByCssSelector(ironic) // disable Ironic
.clickByCssSelector(smile)
.assertElementDisabled(ironic, 'Ironic is enabled with smile')
.assertElementExists('i.tooltip-icon.glyphicon-warning-sign' +
'[data-original-title="Not compatible with smile"]',
1, 'No warning that Ironic is incompatible with smile')
// Create cluster with smile + Sahara
.pressKeys('\uE007'); // Finish
},
'Test additional, -ml2:tun, -vmware, !Sahara, +block:ceph'() {
var smile = 'input[value=additional_service\\:smile]';
var vmware = 'input[value=hypervisor\\:vmware]';
var vlan = 'input[value=network\\:neutron\\:ml2\\:vlan]';
var tun = 'input[value=network\\:neutron\\:ml2\\:tun]';
var sahara = 'input[value=additional_service\\:sahara]';
return this.remote
.updatePlugin('dvs_default test_addit_smile_sahara')
.newClusterFillName(modal)
.pressKeys('\uE007') // go to Compute
// Check that smile is disabled when vCenter is enabled
.clickByCssSelector(vmware)
.assertNextButtonEnabled()
.pressKeys('\uE007') // Networking
.assertNextButtonEnabled()
.pressKeys('\uE007') // Storage
.pressKeys('\uE007') // Additional Services
.clickByCssSelector(sahara)
.assertElementDisabled(smile, 'Smile checkbox is enabled with vCenter')
.clickByCssSelector('button.prev-pane-btn') // back to Storage
.clickByCssSelector('button.prev-pane-btn') // back to Networking
.clickByCssSelector('button.prev-pane-btn') // back to Compute
.clickByCssSelector(vmware)
.assertNextButtonEnabled()
.pressKeys('\uE007') // Networking
// Check that smile is disabled when Neutron with tunneling segmentation is enabled
.clickByCssSelector(vlan)
.clickByCssSelector(tun)
.assertNextButtonEnabled()
.pressKeys('\uE007') // Storage
.pressKeys('\uE007') // Additional Services
.clickByCssSelector(sahara)
.assertElementDisabled(smile, 'Smile checkbox is enabled with tunneling segmentation')
.clickByCssSelector('button.prev-pane-btn') // back to Storage
.clickByCssSelector('button.prev-pane-btn') // back to Networking
// Create cluster with VLAN + Ceph Block Storage + Sahara + smile
.clickByCssSelector(tun)
.clickByCssSelector(vlan)
.assertNextButtonEnabled()
.pressKeys('\uE007') // Storage
.clickByCssSelector('input[value=storage\\:block\\:ceph]')
.pressKeys('\uE007') // Additional Services
.clickByCssSelector(sahara)
.clickByCssSelector(smile)
.pressKeys('\uE007'); // Finish
}
};
});

View File

@ -0,0 +1,241 @@
/*
* Copyright 2016 Mirantis, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may obtain
* a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
**/
import registerSuite from 'intern!object';
import Common from 'tests/functional/pages/common';
import Modal from 'tests/functional/pages/modal';
import 'tests/functional/helpers';
import 'tests/functional/component_registry/component_helpers';
registerSuite(() => {
var common, modal;
return {
name: 'Hypervisors',
setup() {
common = new Common(this.remote);
modal = new Modal(this.remote);
return this.remote
.then(() => common.getIn());
},
afterEach() {
return this.remote
.then(() => modal.close())
.catch(() => true)
.then(() => modal.waitToClose());
},
'Test description of components in wizard with qemu'() {
return this.remote
.updatePlugin('dvs_default test_hyperv_green_light_1')
.newClusterFillName(modal)
.pressKeys('\uE007') // go to Compute
.clickByCssSelector('input[value=hypervisor\\:vmware]') // Enable vcenter
.assertNextButtonEnabled()
.pressKeys('\uE007') // Networking
// Select Neutron with NSXv plugin and check that it has green light
.clickByCssSelector('input[value=network\\:neutron\\:core\\:nsx]')
.assertElementsExist('i.tooltip-icon.glyphicon-ok-sign[data-original-title=' +
'"The component was tested with all the selected components"]',
2, 'Neutron with NSXv plugin has no green light');
},
'Test description of components in wizard without qemu'() {
return this.remote
.updatePlugin('dvs_default test_hyperv_green_light_2')
.newClusterFillName(modal)
.pressKeys('\uE007') // go to Compute
.clickByCssSelector('input[value=hypervisor\\:vmware]') // enable vCenter
.assertNextButtonEnabled()
.pressKeys('\uE007') // Networking
// Select Neutron with NSXv plugin and check that it has green light
.clickByCssSelector('input[value=network\\:neutron\\:core\\:nsx]')
.assertElementsExist('i.tooltip-icon.glyphicon-info-sign[data-original-title=' +
'"This component was not tested with the following ' +
'components: QEMU-KVM"]', 1,
'Neutron with NSXv plugin has green light with QEMU-KVM');
},
'Test hypervisor:libvirt, -xen'() {
var rain = 'input[name=hypervisor\\:libvirt\\:rain]';
var xen = 'input[name=hypervisor\\:xen]';
return this.remote
.updatePlugin('dvs_default test_hyperv_rain')
.newClusterFillName(modal)
.pressKeys('\uE007') // go to Compute
// Enable xen, check that rain is disabled
.clickByCssSelector(xen)
.assertElementDisabled(rain, 'Rain checkbox is enabled with xen')
// Disable xen, enable rain, check that xen is disabled
.clickByCssSelector(xen)
.clickByCssSelector(rain)
.assertElementDisabled(xen, 'Xen checkbox is enabled with rain')
// Create cluster with rain hypervisor
.assertNextButtonEnabled()
.pressKeys('\uE007') // Networking
.assertNextButtonEnabled()
.pressKeys('\uE007') // Storage
.pressKeys('\uE007') // Additional Services
.pressKeys('\uE007') // Finish
.pressKeys('\uE007') // Create
.then(() => modal.waitToClose())
// Delete created environment
.deleteCluster(modal);
},
'Test hypervisor:libvirt, -qemu, -xen'() {
return this.remote
.updatePlugin('dvs_default test_hyperv_rain1')
.newClusterFillName(modal)
.pressKeys('\uE007') // go to Compute
// Check that rain and xen hypervisors are displayed as checkboxes
.assertElementExists('input[name=hypervisor\\:xen][type="checkbox"]',
'Xen is not displayed as a checkbox')
.assertElementExists('input[name=hypervisor\\:libvirt\\:rain1][type="checkbox"]',
'Rain is not displayed as a checkbox');
},
'Test hypervisor:libvirt, -qemu'() {
var sun = 'input[value=hypervisor\\:libvirt\\:sun]';
var qemu = 'input[value=hypervisor\\:qemu]';
return this.remote
.updatePlugin('dvs_default test_hyperv_sun')
.newClusterFillName(modal)
.pressKeys('\uE007') // go to Compute
// Check that sun hypervisor is disabled when qemu is enabled (by default)
.assertElementDisabled(sun, 'Sun checkbox is enabled with qemu')
// Disable qemu, enable sun and check that qemu is disabled
.clickByCssSelector(qemu)
.clickByCssSelector(sun)
.assertElementDisabled(qemu, 'Qemu checkbox is enabled with sun')
// Create cluster with sun hypervisor
.assertNextButtonEnabled()
.pressKeys('\uE007') // Networking
.assertNextButtonEnabled()
.pressKeys('\uE007') // Storage
.pressKeys('\uE007') // Additional Services
.pressKeys('\uE007') // Finish
.pressKeys('\uE007') // Create
.then(() => modal.waitToClose())
// Delete created environment
.deleteCluster(modal);
},
'Test hypervisor, -vmware, !qemu'() {
var vmware = 'input[name=hypervisor\\:vmware]';
var xen = 'input[name=hypervisor\\:xen]';
return this.remote
.updatePlugin('dvs_default test_hyperv_xen')
.newClusterFillName(modal)
.pressKeys('\uE007') // go to Compute
// Enable vCenter and check that xen is disabled
.clickByCssSelector(vmware)
.assertElementDisabled(xen, 'Xen checkbox is enabled with vCenter')
// Disable vCenter, enable xen and check that vCenter is disabled
.clickByCssSelector(vmware)
.clickByCssSelector(xen)
.assertElementDisabled(vmware, 'vCenter checkbox is enabled with xen')
// Create cluster with xen hypervisor
.assertNextButtonEnabled()
.pressKeys('\uE007') // Networking
.assertNextButtonEnabled()
.pressKeys('\uE007') // Storage
.pressKeys('\uE007') // Additional Services
.pressKeys('\uE007') // Finish
.pressKeys('\uE007') // Create
.then(() => modal.waitToClose())
// Delete created environment
.deleteCluster(modal);
},
'Test hypervisor, -hyperv*, !Murano, +Ceilometer'() {
var sun = 'input[value=hypervisor\\:test\\:sun]';
var rain = 'input[value=hypervisor\\:test\\:rain]';
var xen = 'input[value=hypervisor\\:xen]';
return this.remote
.updatePlugin('dvs_default test_hyperv_xen_sun')
.newClusterFillName(modal)
.pressKeys('\uE007') // go to Compute
// Check that xen is not compatible with sun and rain hypervisors
.clickByCssSelector(sun)
.assertElementDisabled(xen, 'Xen checkbox is enabled with sun')
.clickByCssSelector(rain)
.assertElementDisabled(xen, 'Xen checkbox is enabled with sun + rain')
.clickByCssSelector(sun)
.assertElementDisabled(xen, 'Xen checkbox is enabled with rain')
.clickByCssSelector(rain)
.clickByCssSelector(xen)
.assertElementDisabled(sun, 'Sun checkbox is enabled with xen')
.assertElementDisabled(rain, 'Rain checkbox is enabled with xen')
// Try to create cluster with xen without Murano
.assertNextButtonEnabled()
.pressKeys('\uE007') // Networking
.assertNextButtonEnabled()
.pressKeys('\uE007') // Storage
.pressKeys('\uE007') // Additional Services
.pressKeys('\uE007') // Finish
.pressKeys('\uE007') // Create
.then(() => modal.waitToClose())
.assertElementTextEquals('div.text-error', 'Component \'hypervisor:xen\' requires ' +
'any of components from [u\'additional_service:murano\'] set.',
'Error was not displayed');
},
'Test create cluster with xen + Murano + Ceilometer'() {
return this.remote
.updatePlugin('dvs_default test_hyperv_xen_sun')
.newClusterFillName(modal)
// Create cluster with xen + Murano + Ceilometer
.pressKeys('\uE007') // go to Compute
.clickByCssSelector('input[value=hypervisor\\:xen]')
.assertNextButtonEnabled()
.pressKeys('\uE007') // Networking
.assertNextButtonEnabled()
.pressKeys('\uE007') // Storage
.pressKeys('\uE007') // Additional Services
.clickByCssSelector('input[value=additional_service\\:murano]')
.clickByCssSelector('input[value=additional_service\\:ceilometer]')
.pressKeys('\uE007') // Finish
.pressKeys('\uE007') // Create
.then(() => modal.waitToClose())
// Delete created environment
.deleteCluster(modal);
}
};
});

View File

@ -0,0 +1,258 @@
/*
* Copyright 2016 Mirantis, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may obtain
* a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
**/
import registerSuite from 'intern!object';
import Common from 'tests/functional/pages/common';
import Modal from 'tests/functional/pages/modal';
import 'tests/functional/helpers';
import 'tests/functional/component_registry/component_helpers';
registerSuite(() => {
var common, modal;
return {
name: 'Networking',
setup() {
common = new Common(this.remote);
modal = new Modal(this.remote);
return this.remote
.then(() => common.getIn());
},
afterEach() {
return this.remote
.then(() => modal.close())
.catch(() => true)
.then(() => modal.waitToClose());
},
'Test network, -vmware, -dvs, +hyperv*, bind:tun'() {
var vmware = 'input[name=hypervisor\\:vmware]';
var contrail = 'input[value=network\\:neutron\\:contrail]';
return this.remote
.updatePlugin('dvs_default test_network_contr_binded')
.newClusterFillName(modal)
.pressKeys('\uE007') // go to Compute
// Check that Contrail is disabled when vCenter is enabled
.clickByCssSelector(vmware)
.assertNextButtonEnabled()
.pressKeys('\uE007') // Networking
// Go back to Compute and disable vCenter
.clickByCssSelector('.prev-pane-btn')
.clickByCssSelector(vmware)
// Create cluster with qemu + Contrail network + ceph + Sahara
.assertNextButtonEnabled()
.pressKeys('\uE007') // Networking
.clickByCssSelector(contrail)
.assertNextButtonEnabled()
.pressKeys('\uE007') // Storage
.clickByCssSelector('input[value=storage\\:block\\:ceph]')
.pressKeys('\uE007') // Additional Services
.clickByCssSelector('input[value=additional_service\\:sahara]')
.pressKeys('\uE007') // Finish
.pressKeys('\uE007') // Create
.then(() => modal.waitToClose())
// Check that all network configuration of neutron tun is available in Network tab
.clickByCssSelector('a.network.cluster-tab')
.assertElementTextEquals('.title .segmentation-type',
'(Neutron with tunneling segmentation)',
'No tunneling segmentation message')
// Back to Dashboard and delete created environment
.clickByCssSelector('a.dashboard.cluster-tab')
.deleteCluster(modal);
},
'Create cluster with vCenter + dvs network'() {
return this.remote
.updatePlugin('dvs_default test_network_contr_binded')
.newClusterFillName(modal)
.pressKeys('\uE007') // go to Compute
// Create cluster with vCenter + dvs network
.clickByCssSelector('input[name=hypervisor\\:vmware]')
.assertNextButtonEnabled()
.pressKeys('\uE007') // go to Networking
.clickByCssSelector('input[value=network\\:neutron\\:ml2\\:dvs]')
// Create env with vCenter + nsxv
.assertNextButtonEnabled()
.pressKeys('\uE007') // Storage
.pressKeys('\uE007') // Additional Services
.pressKeys('\uE007') // Finish
.pressKeys('\uE007') // Create
.then(() => modal.waitToClose())
// Delete created environment
.deleteCluster(modal);
},
'Test that it is not possibility to create cluster with nsx + dvs'() {
return this.remote
.updatePlugin('dvs_default nsxv_default')
.newClusterFillName(modal)
.pressKeys('\uE007') // go to Compute
.clickByCssSelector('input[name=hypervisor\\:vmware]') // enable vCenter
.assertNextButtonEnabled()
.pressKeys('\uE007') // Networking
// Check that there is no possibility to select multiple networks neutron:nsx and
// neutron:ml2:dvs (choose nsxv, then ml2 + vlan + dvs)
.clickByCssSelector('input[value=network\\:neutron\\:core\\:nsx]')
.clickByCssSelector('input[value=network\\:neutron\\:core\\:ml2]')
.clickByCssSelector('input[name=network\\:neutron\\:ml2\\:vlan]')
.clickByCssSelector('input[name=network\\:neutron\\:ml2\\:dvs]')
// Create env with vCenter + ml2
.assertNextButtonEnabled()
.pressKeys('\uE007') // Storage
.pressKeys('\uE007') // Additional Services
.pressKeys('\uE007') // Finish
.pressKeys('\uE007') // Create
.then(() => modal.waitToClose())
// Delete created environment
.deleteCluster(modal);
},
'Create cluster with neutron:nsx'() {
return this.remote
.updatePlugin('dvs_default nsxv_default')
.newClusterFillName(modal)
.pressKeys('\uE007') // go to Compute
.clickByCssSelector('input[name=hypervisor\\:vmware]') // enable vCenter
.assertNextButtonEnabled()
.pressKeys('\uE007') // Networking
// Check that there is no possibility to select multiple networks neutron:nsx and
// neutron:ml2:dvs (choose nsxv)
.clickByCssSelector('input[value=network\\:neutron\\:core\\:nsx]')
// Create env with vCenter + nsxv
.assertNextButtonEnabled()
.pressKeys('\uE007') // Storage
.pressKeys('\uE007') // Additional Services
.pressKeys('\uE007') // Finish
.pressKeys('\uE007') // Create
.then(() => modal.waitToClose())
// Delete created environment
.deleteCluster(modal);
},
'Test network, -contrail, !ml2, !vmware'() {
return this.remote
.updatePlugin('contrail_default test_network_ml2')
.newClusterFillName(modal)
.pressKeys('\uE007') // go to Compute
.assertNextButtonEnabled()
.pressKeys('\uE007') // Networking
// Check in wizard that network contrail is blocked when dvs network is selected
// (choose contrail)
.clickByCssSelector('input[value=network\\:neutron\\:contrail]')
// Create cluster with contrail
.assertNextButtonEnabled()
.pressKeys('\uE007') // Storage
.pressKeys('\uE007') // Additional Services
.pressKeys('\uE007') // Finish
.pressKeys('\uE007') // Create
.then(() => modal.waitToClose())
// Delete created environment
.deleteCluster(modal);
},
'Test network, -tun, -e:ceph, !Sahara, !ml2, +dvs, +b:ceph, +qemu, +Murano'() {
var vmware = 'input[value=hypervisor\\:vmware]';
var xen = 'input[value=hypervisor\\:xen]';
var vlan = 'input[value=network\\:neutron\\:ml2\\:vlan]';
var tun = 'input[value=network\\:neutron\\:ml2\\:tun]';
var frog = 'input[value=network\\:neutron\\:ml2\\:frog]';
return this.remote
.updatePlugin('dvs_default test_network_ml2_frog')
.newClusterFillName(modal)
.pressKeys('\uE007') // go to Compute
// Check that xen is incompatible with vCenter
.clickByCssSelector(vmware)
.assertElementDisabled(xen, 'Xen is enabled with vCenter')
.clickByCssSelector(vmware)
.clickByCssSelector(xen)
.assertElementDisabled(vmware, 'vCenter is enabled with xen')
.clickByCssSelector(xen)
// Check that frog is disabled with ml2:tun
.assertNextButtonEnabled()
.pressKeys('\uE007') // Networking
.clickByCssSelector(vlan)
.clickByCssSelector(tun)
.assertElementDisabled(frog, 'frog is enabled with tun')
.clickByCssSelector(tun)
.clickByCssSelector(vlan)
// Create cluster with KVM + vCenter, frog + DVS network, Sahara + Murano
.clickByCssSelector('button.prev-pane-btn') // back to Compute
.clickByCssSelector(vmware)
.assertNextButtonEnabled()
.pressKeys('\uE007') // Networking
.clickByCssSelector('input[value=network\\:neutron\\:ml2\\:dvs]')
.clickByCssSelector(frog)
.assertNextButtonEnabled()
.pressKeys('\uE007') // Storage
.assertElementDisabled('input[value=storage\\:ephemeral\\:ceph]',
'Ephemerap Ceph is enabled with frog')
.pressKeys('\uE007') // Additional Services
.clickByCssSelector('input[value=additional_service\\:sahara]')
.clickByCssSelector('input[value=additional_service\\:murano]')
.pressKeys('\uE007') // Finish
.pressKeys('\uE007') // Create
.then(() => modal.waitToClose())
// Delete created environment
.deleteCluster(modal);
},
'Test create cluster without required Sahara'() {
return this.remote
.updatePlugin('dvs_default test_network_ml2_frog')
.newClusterFillName(modal)
.pressKeys('\uE007') // go to Compute
// Try to create cluster with KVM + vCenter hypervisors, frog + DVS network
// without Sahara additional service (should not be created)
.clickByCssSelector('input[value=hypervisor\\:vmware]')
.assertNextButtonEnabled()
.pressKeys('\uE007') // Networking
.clickByCssSelector('input[value=network\\:neutron\\:ml2\\:frog]')
.clickByCssSelector('input[value=network\\:neutron\\:ml2\\:dvs]')
.assertNextButtonEnabled()
.pressKeys('\uE007') // Storage
.pressKeys('\uE007') // Additional Services
.pressKeys('\uE007') // Finish
.pressKeys('\uE007') // Create
.then(() => modal.waitToClose())
.assertElementTextEquals('.text-error', 'Component \'network:neutron:ml2:frog\' ' +
'requires any of components from [u\'additional_service:' +
'sahara\'] set.', 'Error was not displayed');
}
};
});

View File

@ -0,0 +1,192 @@
/*
* Copyright 2016 Mirantis, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may obtain
* a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
**/
import registerSuite from 'intern!object';
import Common from 'tests/functional/pages/common';
import Modal from 'tests/functional/pages/modal';
import 'tests/functional/helpers';
import 'tests/functional/component_registry/component_helpers';
registerSuite(() => {
var common, modal;
return {
name: 'Storage',
setup() {
common = new Common(this.remote);
modal = new Modal(this.remote);
return this.remote
.then(() => common.getIn());
},
afterEach() {
return this.remote
.then(() => modal.close())
.catch(() => true)
.then(() => modal.waitToClose());
},
'Test storage, -object'() {
var nfs = 'input[value=storage\\:block\\:nfs]';
var cat = 'input[value=storage\\:object\\:cat]';
var sheepdog = 'input[value=storage\\:object\\:sheepdog]';
return this.remote
.updatePlugin('dvs_default test_storage_block_nfs')
.newClusterFillName(modal)
.pressKeys('\uE007') // go to Compute
.assertNextButtonEnabled()
.pressKeys('\uE007') // Networking
.assertNextButtonEnabled()
.pressKeys('\uE007') // Storage
// Check that cat and sheepdog are disabled when nfs is enabled
.clickByCssSelector(nfs)
.assertElementDisabled(cat, 'Cat checkbox is enabled with nfs')
.assertElementDisabled(sheepdog, 'Sheepdog checkbox is enabled with nfs')
// Check that nfs is disabled when cat and sheepdog are enabled
.clickByCssSelector(nfs)
.clickByCssSelector(cat)
.assertElementDisabled(nfs, 'Nfs checkbox is enabled with cat')
.clickByCssSelector(sheepdog)
.assertElementDisabled(nfs, 'Nfs checkbox is enabled with sheepdog')
.clickByCssSelector(cat)
.clickByCssSelector(sheepdog)
// Create cluster with nfs Block Storage
.clickByCssSelector(nfs)
.pressKeys('\uE007') // Additional Services
.pressKeys('\uE007') // Finish
.pressKeys('\uE007') // Create
.then(() => modal.waitToClose())
// Delete created environment
.deleteCluster(modal).sleep(10000);
},
'Test storage -storage:image'() {
var nfs = 'input[value=storage\\:image\\:nfs]';
var zfs = 'input[value=storage\\:block\\:zfs]';
return this.remote
.updatePlugin('dvs_default test_storage_block_zfs')
.newClusterFillName(modal)
.pressKeys('\uE007') // go to Compute
.assertNextButtonEnabled()
.pressKeys('\uE007') // Networking
.assertNextButtonEnabled()
.pressKeys('\uE007') // Storage
// Check that zfs block storage is disabled when nfs image storage enabled
.clickByCssSelector(nfs)
.assertElementDisabled(zfs, 'Zfs checkbox is enabled with nfs')
// Check that nfs image storage is disabled when zfs block storage enabled
.clickByCssSelector(nfs) // disable nfs
.clickByCssSelector(zfs)
.assertElementDisabled(nfs, 'Nfs checkbox is enabled with zfs')
// Create cluster with zfs
.pressKeys('\uE007') // Additional Services
.pressKeys('\uE007') // Finish
.pressKeys('\uE007') // Create
.then(() => modal.waitToClose())
// Delete created environment
.deleteCluster(modal);
},
'Test storage:image, -image:ceph'() {
var swift = 'input[value=storage\\:image\\:swift]';
var ceph = 'input[value=storage\\:image\\:ceph]';
return this.remote
.updatePlugin('dvs_default test_storage_image_swift')
.newClusterFillName(modal)
.pressKeys('\uE007') // go to Compute
.assertNextButtonEnabled()
.pressKeys('\uE007') // Networking
.assertNextButtonEnabled()
.pressKeys('\uE007') // Storage
// Check that Ceph image storage is inactive when swift image storage is
// active and vice versa
.clickByCssSelector(swift)
.assertElementPropertyEquals(ceph, 'checked', false, 'Ceph is enabled with swift')
.clickByCssSelector(ceph)
.assertElementPropertyEquals(swift, 'checked', false, 'Swift is enabled with ceph');
},
'Test storage:image, -image:ceph, +storage:image'() {
var ceph = 'input[value=storage\\:image\\:ceph]';
var swift = 'input[value=storage\\:image\\:swift]';
return this.remote
.updatePlugin('dvs_default test_storage_image_swift_cat')
.newClusterFillName(modal)
.pressKeys('\uE007') // go to Compute
.assertNextButtonEnabled()
.pressKeys('\uE007') // Networking
.assertNextButtonEnabled()
.pressKeys('\uE007') // Storage
// Check that Ceph image storage is inactive when swift image storage is
// active and vice versa
.clickByCssSelector('input[value=storage\\:image\\:cat]')
.clickByCssSelector(ceph)
.assertElementDisabled(swift, 'Swift is enabled with ceph')
.clickByCssSelector(ceph) // disable Ceph
.clickByCssSelector(swift)
.assertElementDisabled(ceph, 'Ceph is enabled with swift')
// Create cluster with qemu + Neutron vlan + Swift + cat
.pressKeys('\uE007') // Additional Services
.pressKeys('\uE007') // Finish
.pressKeys('\uE007') // Create
.then(() => modal.waitToClose())
// Delete created environment
.deleteCluster(modal);
},
'Test storage:object, -block:lvm'() {
var cat = 'input[value=storage\\:object\\:cat]';
return this.remote
.updatePlugin('dvs_default test_storage_object_cat')
.newClusterFillName(modal)
.pressKeys('\uE007') // go to Compute
.assertNextButtonEnabled()
.pressKeys('\uE007') // Networking
.assertNextButtonEnabled()
.pressKeys('\uE007') // Storage
// Check that cat is disabled when LVM is enabled (by default)
.assertElementDisabled(cat, 'cat is enabled with LVM')
// Create cluster with Ceph block storage + Stor ceph
.clickByCssSelector('input[value=storage\\:block\\:ceph]')
.clickByCssSelector(cat)
.pressKeys('\uE007') // Additional Services
.pressKeys('\uE007') // Finish
.pressKeys('\uE007') // Create
.then(() => modal.waitToClose())
// Delete created environment
.deleteCluster(modal);
}
};
});

View File

@ -0,0 +1,101 @@
/*
* Copyright 2016 Mirantis, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may obtain
* a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
**/
import registerSuite from 'intern!object';
import Common from 'tests/functional/pages/common';
import Modal from 'tests/functional/pages/modal';
import 'tests/functional/helpers';
import 'tests/functional/component_registry/component_helpers';
registerSuite(() => {
var common, modal;
return {
name: 'UI components',
setup() {
common = new Common(this.remote);
modal = new Modal(this.remote);
return this.remote
.then(() => common.getIn());
},
'Test that all components, chosen in Wizard tab, are enabled on Setting tab'() {
return this.remote
.updatePlugin('dvs_default contrail_default')
.newClusterFillName(modal)
.pressKeys('\uE007') // go to Compute
// Create cluster with all compatible elements in wizard
.clickByCssSelector('input[value=hypervisor\\:vmware]') // vCenter
.assertNextButtonEnabled()
.pressKeys('\uE007') // Networking
.clickByCssSelector('input[value=network\\:neutron\\:ml2\\:dvs]') // VMware DVS
.assertNextButtonEnabled()
.pressKeys('\uE007') // Storage
.clickByCssSelector('input[value=storage\\:image\\:ceph]') // image Ceph
.clickByCssSelector('input[value=storage\\:object\\:ceph]') // object Ceph
.clickByCssSelector('input[value=storage\\:ephemeral\\:ceph]') // ephemeral Ceph
.pressKeys('\uE007') // Additional Services
.clickByCssSelector('input[value=additional_service\\:sahara]') // Sahara
.clickByCssSelector('input[value=additional_service\\:murano]') // Murano
.clickByCssSelector('input[value=additional_service\\:ceilometer]') // Ceilometer
.clickByCssSelector('input[value=additional_service\\:ironic]') // Ironic
.pressKeys('\uE007') // Finish
.pressKeys('\uE007') // Create
.then(() => modal.waitToClose())
// Check that all components, chosen in Wizard tab, are enabled on Setting tab
.clickByCssSelector('a.settings.cluster-tab')
.clickByCssSelector('a.subtab-link-storage')
.assertElementPropertyEquals('input[name=images_ceph]', 'checked', true,
'image Ceph is disabled') // image Ceph
.assertElementPropertyEquals('input[name=objects_ceph]', 'checked', true,
'object Ceph is disabled') // object Ceph
.assertElementPropertyEquals('input[name=ephemeral_ceph]', 'checked', true,
'ephemeral Ceph is disabled') // ephemeral Ceph
.clickByCssSelector('a.subtab-link-openstack_services')
.assertElementPropertyEquals('input[name=sahara]', 'checked', true,
'Sahara is disabled') // Sahara
.assertElementPropertyEquals('input[name=murano]', 'checked', true,
'Murano is disabled') // Murano
.assertElementPropertyEquals('input[name=ceilometer]', 'checked', true,
'Ceilometer is disabled') // Ceilometer
.assertElementPropertyEquals('input[name=ironic]', 'checked', true,
'Ironic is disabled') // Ironic
.assertElementExists('a.vmware.cluster-tab',
'VMware tab is not presented') // vCenter
// Delete created environment
.clickByCssSelector('a.dashboard.cluster-tab')
.deleteCluster(modal);
},
'Test that when vcenter is selected as compute, contrail should be turned off'() {
return this.remote
.updatePlugin('dvs_default contrail_default')
.newClusterFillName(modal)
.pressKeys('\uE007') // go to Compute
// Check that contrail is disabled when vCenter is enabled
.clickByCssSelector('input[value=hypervisor\\:vmware]')
.assertNextButtonEnabled()
.pressKeys('\uE007') // Networking
.assertElementDisabled('input[value=network\\:neutron\\:contrail]',
'Contrail checkbox is enabled with vCenter')
.then(() => modal.waitToClose());
}
};
});