Refactoring networks.js library

Changes:
Class structure implementation
Css selectors splitting and reworking
Functions rework due to new class and selectors structure
Code cleanup
Mistakes fixing

Change-Id: Ic36f5c33788efad6f326e61d8db7763c7eefbfd2
This commit is contained in:
Grigory Mikhailov 2016-07-18 10:33:12 +03:00
parent 5684d7460e
commit 3226e8b915
10 changed files with 909 additions and 1088 deletions

9
static/tests/functional/helpers.js Normal file → Executable file
View File

@ -429,6 +429,15 @@ _.defaults(Command.prototype, {
.end();
});
},
assertElementPropertyMatchesRegExp(cssSelector, attribute, regExp, message) {
return new this.constructor(this, function() {
return this.parent
.findByCssSelector(cssSelector)
.getProperty(attribute)
.then((actualText) => assert.match(actualText, regExp, message))
.end();
});
},
assertElementSelected(cssSelector, message) {
return new this.constructor(this, function() {
return this.parent

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,397 @@
/*
* 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 'tests/functional/helpers';
import ModalWindow from 'tests/functional/pages/modal';
import GenericLib from 'tests/functional/nightly/library/generic';
class NetworksGenericLib {
constructor(remote) {
this.remote = remote;
this.modal = new ModalWindow(remote);
this.generic = new GenericLib(remote);
this.netGroupListSelector = 'ul.node_network_groups ';
this.allNetSelector = 'input.show-all-networks:enabled';
this.btnAddGroupSelector = 'button.add-nodegroup-btn';
this.btnSaveSelector = 'button.apply-btn';
this.btnCancelSelector = 'button.btn-revert-changes';
this.btnVerifySelector = 'button.verify-networks-btn';
this.errorSelector = 'div.has-error ';
this.netGroupNamePaneSelector = 'div.network-group-name ';
this.netGroupNameSelector = this.netGroupNamePaneSelector + 'div.name';
this.netGroupInfoSelector = this.netGroupNamePaneSelector + 'span.explanation';
this.showMsg = '"Show All Networks" checkbox is ';
}
goToNodeNetworkSubTab(groupName) {
var networkSubTabSelector = 'div[id="network-subtabs"]';
return this.remote
.assertElementAppears(networkSubTabSelector, 1000, 'Network subtab list exists')
.assertElementContainsText(networkSubTabSelector, groupName, groupName + ' link exists')
.findByCssSelector(networkSubTabSelector)
.clickLinkByText(groupName)
.sleep(500)
.assertElementContainsText('li.active', groupName, groupName + ' link is opened')
.end();
}
saveSettings() {
return this.remote
.assertElementEnabled(this.btnSaveSelector, '"Save Settings" button is enabled')
.clickByCssSelector(this.btnSaveSelector)
.assertElementDisabled(this.btnSaveSelector, '"Save Settings" button is disabled')
.assertElementNotExists(this.errorSelector, 'Settings saved successfully');
}
cancelChanges() {
return this.remote
.assertElementEnabled(this.btnCancelSelector, '"Cancel Changes" button is enabled')
.clickByCssSelector(this.btnCancelSelector)
.assertElementDisabled(this.btnCancelSelector, '"Cancel Changes" button is disabled')
.assertElementNotExists(this.errorSelector, 'Settings canceled successfully');
}
checkNetworkSettingsSegment(neutronType) {
var netDescSelector = 'div.network-description';
var startSelector = 'input[name^="range-start"]';
var endSelector = 'input[name^="range-end"]';
var spanSelector = 'span.subtab-group-';
var dvrSelector = 'input[name="neutron_dvr"]:disabled';
var l2PopSelector = 'input[name="neutron_l2_pop"]:enabled';
if (neutronType.toLowerCase() === 'vlan') {
l2PopSelector = dvrSelector = 'input[name="neutron_dvr"]:enabled';
}
var l2Msg = '"Neutron L2" ';
var floatMsg = '"Floating Network" ';
var adminMsg = '"Admin Tenant Network" ';
var dnsMsg = '"Guest OS DNS Servers" ';
var extMsg = '"Host OS Servers" ';
var l2NetMsg = RegExp('Neutron supports different types of network segmentation such as ' +
'VLAN, GRE, VXLAN etc. This section is specific to (VLAN|a tunneling) segmentation related ' +
'parameters such as (VLAN|Tunnel) ID ranges for tenant separation and the Base MAC address');
var floatNetMsg = RegExp('This network is used to assign Floating IPs to tenant VMs');
var adminNetMsg = RegExp('This Admin Tenant network provides internal network access for ' +
'instances. It can be used only by the Admin tenant.');
var dnsNetMsg = RegExp('This setting is used to specify the upstream name servers for the ' +
'environment. These servers will be used to forward DNS queries for external DNS names to ' +
'DNS servers outside the environment');
var extNetMsg = RegExp('Host OS (DNS|NTP) Servers');
return this.remote
// Neutron L2 subtab
.clickByCssSelector('a.subtab-link-neutron_l2')
.assertElementExists('li.active a.subtab-link-neutron_l2', l2Msg + 'subtab is selected')
.assertElementTextEquals('h3.networks', 'Neutron L2 Configuration', l2Msg + 'subtab isopened')
.assertElementMatchesRegExp(netDescSelector, l2NetMsg, l2Msg + 'description is correct')
.assertElementEnabled(startSelector, '"VLAN/Tunnel ID range" start textfield is enabled')
.assertElementEnabled(endSelector, '"VLAN/Tunnel ID range" end textfield is enabled')
.assertElementEnabled('input[name="base_mac"]', '"Base MAC address" textfield is enabled')
// Neutron L3 subtab
.clickByCssSelector('a.subtab-link-neutron_l3')
.assertElementExists('li.active a.subtab-link-neutron_l3', '"Neutron L3" subtab is selected')
.findByCssSelector('div.form-floating-network')
.assertElementTextEquals('h3', 'Floating Network Parameters', floatMsg + 'name is correct')
.assertElementMatchesRegExp(netDescSelector, floatNetMsg, floatMsg + 'description correct')
.assertElementEnabled(startSelector, floatMsg + 'ip range start textfield is enabled')
.assertElementEnabled(endSelector, floatMsg + 'ip range end textfield is enabled')
.assertElementEnabled('input[name="floating_name"]', floatMsg + 'name textfield is enabled')
.end()
.findByCssSelector('div.form-internal-network')
.assertElementTextEquals('h3', 'Admin Tenant Network Parameters', adminMsg + 'name correct')
.assertElementMatchesRegExp(netDescSelector, adminNetMsg, adminMsg + 'description correct')
.assertElementEnabled('input[name="internal_cidr"]', adminMsg + 'CIDR textfield is enabled')
.assertElementEnabled('input[name="internal_gateway"]', adminMsg + 'gateway txtfld enabled')
.assertElementEnabled('input[name="internal_name"]', adminMsg + 'name textfield is enabled')
.end()
.findByCssSelector('div.form-dns-nameservers')
.assertElementTextEquals('h3', 'Guest OS DNS Servers', dnsMsg + 'name is correct')
.assertElementMatchesRegExp(netDescSelector, dnsNetMsg, dnsMsg + 'description is correct')
.assertElementsExist('input[name=dns_nameservers]', 2, dnsMsg + 'both txtfields are exists')
.end()
// Other subtab
.clickByCssSelector('a.subtab-link-network_settings')
.assertElementExists('li.active a.subtab-link-network_settings', '"Other" subtab is selected')
.assertElementTextEquals(spanSelector + 'public_network_assignment',
'Public network assignment', '"Public network assignment" name is correct')
.assertElementEnabled('input[name="assign_to_all_nodes"]',
'"Assign public network to all nodes" checkbox is enabled')
.assertElementTextEquals(spanSelector + 'neutron_advanced_configuration',
'Neutron Advanced Configuration', '"Neutron Advanced Configuration" name is correct')
.assertElementEnabled('input[name="neutron_l3_ha"]', '"Neutron L3 HA" checkbox enabled')
.assertElementExists(dvrSelector, '"Neutron DVR" checkbox exists and is enabled/disabled')
.assertElementExists(l2PopSelector, l2Msg + 'population checkbox is not exist/exists')
.assertElementMatchesRegExp(spanSelector + 'external_dns', extNetMsg, extMsg + 'name correct')
.assertElementEnabled('input[name="dns_list"]', '"DNS list" textfield is enabled')
.assertElementMatchesRegExp(spanSelector + 'external_ntp', extNetMsg, extMsg + 'name correct')
.assertElementEnabled('input[name="ntp_list"]', '"NTP server list" textfield is enabled');
}
checkNetworkVerificationSegment() {
var connectSelector = 'div.connect-';
var verifyNodeSelector = 'div.verification-node-';
var descSelector = 'ol.verification-description';
var descMsg = RegExp('Network verification checks the following[\\s\\S]*L2 connectivity ' +
'checks between nodes in the environment[\\s\\S]*DHCP discover check on all nodes[\\s\\S]*' +
'Repository connectivity check from the Fuel Master node[\\s\\S]*Repository connectivity ' +
'check from the Fuel Slave nodes through the public & admin.*PXE.*networks[\\s\\S]*', 'i');
return this.remote
.then(() => this.goToNodeNetworkSubTab('Connectivity Check'))
// Check default picture router scheme
.findByCssSelector('div.verification-network-placeholder')
.assertElementExists('div.verification-router', 'Main router picture is observed')
.assertElementExists(connectSelector + '1', 'Connection line "left" node #1 is observed')
.assertElementExists(connectSelector + '2', 'Connection line "center" node #2 is observed')
.assertElementExists(connectSelector + '3', 'Connection line "right" node #3 is observed')
.assertElementExists(verifyNodeSelector + '1', '"Left" node #1 picture is observed')
.assertElementExists(verifyNodeSelector + '2', '"Center" node #2 picture is observed')
.assertElementExists(verifyNodeSelector + '3', '"Right" node #3 picture is observed')
.end()
// Check default verification description
.assertElementExists(descSelector, '"Connectivity check" description is observed')
.assertElementMatchesRegExp(descSelector, descMsg, '"Connectivity check" description correct')
.assertElementExists(this.btnVerifySelector, '"Verify Networks" exists')
.assertElementDisabled(this.btnCancelSelector, '"Cancel Changes" button is disabled')
.assertElementDisabled(this.btnSaveSelector, '"Save Settings" button is disabled');
}
checkIncorrectValueInput(inputSelector, value, errorSelector, errorMessage) {
var errorMsg = 'Error message appears for "' + inputSelector + '" with "' + value + '" value';
return this.remote
.assertElementEnabled(inputSelector, '"' + inputSelector + '" is enabled')
.setInputValue(inputSelector, value)
.assertElementAppears(errorSelector, 1000, errorMsg)
.assertElementContainsText(errorSelector, errorMessage, errorMsg + ' has correct decription')
.then(() => this.checkMultirackVerification());
}
checkMultirackVerification() {
return this.remote
.assertElementDisabled(this.btnSaveSelector, '"Save Settings" button is disabled')
.then(() => this.goToNodeNetworkSubTab('Connectivity Check'))
.assertElementDisabled(this.btnVerifySelector, '"Verify Networks" button is disabled')
.then(() => this.goToNodeNetworkSubTab('default'));
}
createNetworkGroup(groupName) {
return this.remote
.findByCssSelector(this.allNetSelector)
.isSelected()
.then((isSelected) => this.createNetworkGroupBody(groupName, true, isSelected))
.end()
.catch(() => this.createNetworkGroupBody(groupName, false, false))
.catch((error) => {
this.remote.then(() => this.modal.close());
throw new Error('Unexpected error via network group creation: ' + error);
});
}
createNetworkGroupBody(groupName, allNetExists, allNetSelected) {
var groupSelector = 'div[data-name="' + groupName + '"] ';
var groupNameSelector = 'input.node-group-input-name';
var bfMsg = ' before new group creation';
var afterMsg = ' after new group creation';
var chain = this.remote;
// Precondition check
if (!allNetExists) {
chain = chain.assertElementNotExists(this.allNetSelector, this.showMsg + 'not exist' + bfMsg);
} else if (allNetSelected) {
chain = chain.assertElementSelected(this.allNetSelector, this.showMsg + 'selected' + bfMsg);
} else {
chain = chain.assertElementNotSelected(this.allNetSelector, this.showMsg + 'not sel' + bfMsg);
}
// Generic body
chain = chain.assertElementEnabled(this.btnAddGroupSelector, 'Add Network Group button enabled')
.clickByCssSelector(this.btnAddGroupSelector)
.then(() => this.modal.waitToOpen())
.then(() => this.modal.checkTitle('Add New Node Network Group'))
.assertElementEnabled(groupNameSelector, '"Modal name" textfield is enabled')
.setInputValue(groupNameSelector, groupName)
.then(() => this.modal.clickFooterButton('Add Group'))
.then(() => this.modal.waitToClose());
// Postcondition check
if (allNetSelected) {
chain = chain.assertElementSelected(this.allNetSelector, this.showMsg + 'selected' + afterMsg)
.assertElementAppears(groupSelector, 1000, groupName + ' node network group appears');
} else {
chain = chain.assertElementDisappears(this.netGroupInfoSelector, 1000, 'New subtab is shown')
.assertElementTextEquals(this.netGroupListSelector + 'li.active a', groupName,
'New network group is appears, selected and name is correct')
.assertElementContainsText(this.netGroupNameSelector, groupName, groupName + ' title appears')
.assertElementNotSelected(this.allNetSelector, this.showMsg + 'not selected' + afterMsg);
}
return chain;
}
deleteNetworkGroup(groupName) {
var netGroupLeftSelector = this.netGroupListSelector + 'a';
return this.remote
.then(() => {
return this.remote.then(() => this.goToNodeNetworkSubTab(groupName))
.assertElementNotSelected(this.allNetSelector, this.showMsg + 'not sel-ed before group del')
.findAllByCssSelector(netGroupLeftSelector)
.then((groups) => this.deleteNetworkGroupBody(groupName, false, groups.length))
.end();
})
.catch(() => {
return this.remote.then(() => this.goToNodeNetworkSubTab('All Networks'))
.assertElementSelected(this.allNetSelector, this.showMsg + 'selected before group deletion')
.findAllByCssSelector(this.netGroupNamePaneSelector)
.then((groups) => this.deleteNetworkGroupBody(groupName, true, groups.length))
.end();
})
.catch((error) => {throw new Error('Cannot delete default node network group: ' + error);});
}
deleteNetworkGroupBody(groupName, allNetSelected, numGroups) {
var groupSelector = 'div[data-name="' + groupName + '"] ';
var removeSelector = groupSelector + 'i.glyphicon-remove-alt';
var afterMsg = this.showMsg + 'after group deletion ';
var tmpMsg = '"' + groupName + '" node network group disappears from ';
var chain = this.remote;
// Generic body
chain = chain.assertElementAppears(removeSelector, 1000, 'Remove icon is shown')
.clickByCssSelector(removeSelector)
.then(() => this.modal.waitToOpen())
.then(() => this.modal.checkTitle('Remove Node Network Group'))
.then(() => this.modal.clickFooterButton('Delete'))
.then(() => this.modal.waitToClose());
// Postcondition check
if ((numGroups > 2 && !allNetSelected) || (numGroups <= 2)) {
chain = chain.assertElementAppears(this.netGroupInfoSelector, 1000, 'Default subtab is shown')
.assertElementNotContainsText(this.netGroupListSelector, groupName, tmpMsg + 'net group list')
.assertElementNotContainsText(this.netGroupNameSelector, groupName, tmpMsg + 'Networks tab');
if (numGroups <= 2) {
chain = chain.assertElementNotExists(this.allNetSelector, afterMsg + 'is not exist');
} else {
chain = chain.assertElementNotSelected(this.allNetSelector, afterMsg + 'is not selected');
}
} else {
chain = chain.assertElementDisappears(groupSelector, 1000, tmpMsg + '"All Networks" subtab')
.assertElementSelected(this.allNetSelector, afterMsg + 'is selected');
}
return chain;
}
checkDefaultNetworkGroup() {
var defSelector = this.netGroupListSelector + 'li[role="presentation"]';
return this.remote
.assertElementContainsText(this.netGroupListSelector, 'default', 'Name is correct')
.assertElementPropertyEquals(defSelector, 'offsetTop', '50', 'First node net group is found')
.assertElementTextEquals(defSelector, 'default', '"default" network group is on top');
}
checkGateways(groupName, neutronType) {
var infoMsg = ' "Gateway" field exists and disabled for "' + groupName + '" network group';
var chain = this.remote;
chain = chain.assertElementDisabled('div.storage input[name="gateway"]', 'Storage' + infoMsg)
.assertElementDisabled('div.management input[name="gateway"]', 'Management' + infoMsg);
if (neutronType.toLowerCase() === 'vlan') {
chain = chain.assertElementDisabled('div.private input[name="gateway"]', 'Private' + infoMsg);
}
return chain;
}
checkVLANs(groupName, neutronType) {
var vlanSelector = ' div.vlan_start input[type="text"]';
var msg = 'Use VLAN tagging" textfield has default value for "' + groupName + '" network group';
var chain = this.remote;
chain = chain.assertElementPropertyEquals('div.storage' + vlanSelector, 'value', '102', msg)
.assertElementPropertyEquals('div.management' + vlanSelector, 'value', '101', msg);
if (neutronType.toLowerCase() === 'vlan') {
chain = chain.assertElementPropertyEquals('div.private' + vlanSelector, 'value', '103', msg);
}
chain = chain.assertElementDisabled(this.btnSaveSelector, '"Save Settings" button is disabled')
.assertElementDisabled(this.btnCancelSelector, '"Cancel Changes" button is disabled')
.assertElementNotExists(this.errorSelector, 'No Networks errors are observed');
return chain;
}
checkMergedNetworksGrouping(networkNamesArray) {
// Input array "networkNamesArray": [name#1, name#2, ...] by their position on page
var netSelector1 = 'div.col-xs-10 div:nth-child(';
var netSelector2 = ') ' + this.netGroupNameSelector;
var chain = this.remote;
chain.assertElementsAppear(this.allNetSelector + ':checked', 1000, this.showMsg + 'appear');
for (var i = 1; i <= networkNamesArray.length; i++) {
chain = chain.waitForCssSelector(netSelector1 + i + netSelector2, 1000)
.assertElementContainsText(netSelector1 + i + netSelector2, networkNamesArray[i - 1],
'"' + networkNamesArray[i - 1] + '" network group true positioned and has correct name');
}
return chain;
}
checkNetworksGrouping(networkNamesArray) {
// Input array "networkNamesArray": [name#1, name#2, ...] by their position on page
var netSelector1 = this.netGroupListSelector + 'li:nth-child(';
var netSelector2 = ') a';
var chain = this.remote;
for (var i = 2; i < networkNamesArray.length + 2; i++) {
chain = chain.waitForCssSelector(netSelector1 + i + netSelector2, 1000)
.assertElementContainsText(netSelector1 + i + netSelector2, networkNamesArray[i - 2],
'"' + networkNamesArray[i - 2] + '" network group true positioned and has correct name');
}
return chain;
}
selectAllNetworks(toSelectBool) {
// Input var "toSelectBool": true - select checkbox, false - unselect
return this.remote
.assertElementsExist(this.allNetSelector, '"Show All Networks" checkbox exists')
.findByCssSelector(this.allNetSelector)
.isSelected()
.then((isSelected) => {
if (isSelected && !toSelectBool) {
return this.remote.clickByCssSelector(this.allNetSelector)
.assertElementNotSelected(this.allNetSelector, '"Show All Networks" is not selected');
} else if (!isSelected && toSelectBool) {
return this.remote.clickByCssSelector(this.allNetSelector)
.assertElementSelected(this.allNetSelector, '"Show All Networks" is selected');
} else {
return false;
}
})
.end();
}
checkHelpPopover(toolTipSelector, popoverText) {
var popoverSelector = 'div.requirements-popover';
return this.remote
.waitForCssSelector(toolTipSelector, 2000)
.then(() => this.generic.moveCursorTo(toolTipSelector))
.assertElementAppears(popoverSelector, 500, 'Help popover appears')
.assertElementMatchesRegExp(popoverSelector, popoverText, 'Help popover text is correct');
}
renameNetworkGroup(oldName, newName) {
var oldGroupSelector = 'div[data-name="' + oldName + '"] ';
var newGroupSelector = 'div[data-name="' + newName + '"] ';
var pencilSelector = oldGroupSelector + 'i.glyphicon-pencil';
var renameSelector = oldGroupSelector + 'input[name="new-name"]';
return this.remote
.assertElementsAppear(pencilSelector, 1000, '"Pencil" icon appears')
.clickByCssSelector(pencilSelector)
.assertElementAppears(renameSelector, 1000, 'Node network group renaming control appears')
.findByCssSelector(renameSelector)
.clearValue()
.type(newName)
.type('\uE007')
.end()
.assertElementsAppear(newGroupSelector, 1000, 'New network group appears')
.assertElementNotExists(oldGroupSelector, 'Old network group is not exist');
}
}
export default NetworksGenericLib;

View File

@ -21,7 +21,7 @@ import DashboardPage from 'tests/functional/pages/dashboard';
import NodeComponent from 'tests/functional/pages/node';
import ModalWindow from 'tests/functional/pages/modal';
import NodesLib from 'tests/functional/nightly/library/nodes';
import NetworksLib from 'tests/functional/nightly/library/networks';
import GenericNetworksLib from 'tests/functional/nightly/library/networks_generic';
import DashboardLib from 'tests/functional/nightly/library/dashboard';
registerSuite(() => {
@ -41,7 +41,7 @@ registerSuite(() => {
clusterPage = new ClusterPage(this.remote);
dashboardPage = new DashboardPage(this.remote);
nodesLib = new NodesLib(this.remote);
networksLib = new NetworksLib(this.remote);
networksLib = new GenericNetworksLib(this.remote);
dashboardLib = new DashboardLib(this.remote);
clusterName = common.pickRandomName('Test Cluster');
@ -50,7 +50,7 @@ registerSuite(() => {
.then(() => common.createCluster(clusterName));
},
'Check deployment/provisioning with node in "Offline"/"Error" state'() {
this.timeout = 45000;
this.timeout = 60000;
var offlineNodesAmount = 1;
var errorNodesAmount = 1;
return this.remote
@ -73,7 +73,7 @@ registerSuite(() => {
.then(() => dashboardPage.discardChanges());
},
'Check that "Regular deployment" works as expected'() {
this.timeout = 75000;
this.timeout = 100000;
var provisionNodesAmount = 1;
var nodeStatus = 'ready';
var clusterStatus = 'Operational';
@ -101,7 +101,7 @@ registerSuite(() => {
.then(() => dashboardPage.discardChanges());
},
'Check nodes selection dialog supports Quick Search, Sorting and Filtering'() {
this.timeout = 90000;
this.timeout = 100000;
var provisionControllerAmount = 1;
var provisionComputeAmount = 1;
var provisionNodesAmount = provisionControllerAmount + provisionComputeAmount;
@ -138,7 +138,7 @@ registerSuite(() => {
initialStatus, computeName, provisionStatus, clusterName, clusterStatus));
},
'Check that "Regular deployment" works as expected for provisioned/deployed part of nodes'() {
this.timeout = 45000;
this.timeout = 75000;
var provisionNodesAmount = 1;
var deployNodesAmount = 1;
var nodeStatus = 'ready';
@ -185,7 +185,7 @@ registerSuite(() => {
.then(() => clusterPage.goToTab('Dashboard'));
},
'Check that "Deployment only" works as expected'() {
this.timeout = 45000;
this.timeout = 75000;
var provisionNodesAmount = 3;
var deployNodesAmount = 3;
var nodeStatus = 'ready';
@ -212,7 +212,7 @@ registerSuite(() => {
.then(() => dashboardPage.discardChanges());
},
'Check Virt role provisioning'() {
this.timeout = 60000;
this.timeout = 75000;
var vmConfigJson = '[{"id":1,"mem":2,"cpu":2}]';
var paneName = '"VMs provisioning"';
var node = new NodeComponent(this.remote);

View File

@ -22,7 +22,7 @@ import ModalWindow from 'tests/functional/pages/modal';
import Command from 'intern/dojo/node!leadfoot/Command';
import GenericLib from 'tests/functional/nightly/library/generic';
import EquipmentLib from 'tests/functional/nightly/library/equipment';
import NetworksLib from 'tests/functional/nightly/library/networks';
import GenericNetworksLib from 'tests/functional/nightly/library/networks_generic';
import DashboardPage from 'tests/functional/pages/dashboard';
registerSuite(() => {
@ -63,7 +63,7 @@ registerSuite(() => {
command = new Command(this.remote);
genericLib = new GenericLib(this.remote);
equipmentLib = new EquipmentLib(this.remote);
networksLib = new NetworksLib(this.remote);
networksLib = new GenericNetworksLib(this.remote);
dashboardPage = new DashboardPage(this.remote);
return this.remote
@ -72,7 +72,7 @@ registerSuite(() => {
.then(() => common.addNodesToCluster(nodesController, ['Controller']))
.then(() => common.addNodesToCluster(nodesCompute, ['Compute']))
.then(() => clusterPage.goToTab('Networks'))
.then(() => networksLib.gotoNodeNetworkSubTab('Other'))
.then(() => networksLib.goToNodeNetworkSubTab('Other'))
.clickByCssSelector(toAllNodesSelector)
.then(() => networksLib.saveSettings());
},

View File

@ -17,12 +17,13 @@
import registerSuite from 'intern!object';
import Common from 'tests/functional/pages/common';
import ClusterPage from 'tests/functional/pages/cluster';
import GenericNetworksLib from 'tests/functional/nightly/library/networks_generic';
import NetworksLib from 'tests/functional/nightly/library/networks';
import SettingsLib from 'tests/functional/nightly/library/settings';
import EquipmentLib from 'tests/functional/nightly/library/equipment';
registerSuite(() => {
var common, clusterPage, clusterName, networksLib, settingsLib, equipmentLib;
var common, clusterPage, clusterName, networksLib, baremetalNetwork, settingsLib, equipmentLib;
var networkName = 'Baremetal';
var baremetalSelector = 'div.' + networkName.toLowerCase() + ' ';
var ipRangesSelector = baremetalSelector + 'div.ip_ranges ';
@ -39,7 +40,8 @@ registerSuite(() => {
// Create cluster with additional service "Ironic"
common = new Common(this.remote);
clusterPage = new ClusterPage(this.remote);
networksLib = new NetworksLib(this.remote);
networksLib = new GenericNetworksLib(this.remote);
baremetalNetwork = new NetworksLib(this.remote, networkName);
settingsLib = new SettingsLib(this.remote);
equipmentLib = new EquipmentLib(this.remote);
clusterName = common.pickRandomName('Ironic Cluster');
@ -72,7 +74,7 @@ registerSuite(() => {
.assertElementsExist(ironicSelector, 'Ironic checkbox is enabled and selected')
// Check "Baremetal Network" initial state
.then(() => clusterPage.goToTab('Networks'))
.then(() => networksLib.checkNetworkInitialState(networkName));
.then(() => baremetalNetwork.checkNetworkInitialState());
},
'Baremetal Network "IP Ranges" correct changing'() {
var correctIpRange = ['192.168.3.15', '192.168.3.40'];
@ -92,16 +94,16 @@ registerSuite(() => {
.setInputValue(startIpSelector, correctIpRange[0])
.setInputValue(endIpSelector, correctIpRange[1])
// Add new IP range
.then(() => networksLib.addNewIpRange(networkName, newIpRange))
.then(() => baremetalNetwork.addNewIpRange(newIpRange))
.then(() => networksLib.saveSettings())
// Remove just added IP range
.then(() => networksLib.deleteIpRange(networkName))
.then(() => baremetalNetwork.deleteIpRange())
.then(() => networksLib.saveSettings());
},
'Baremetal and other networks intersections'() {
this.timeout = 45000;
// [Baremetal CIDR, Baremetal Start IP, Baremetal End IP, Ironic Start IP,
// Ironic End IP, Ironic Gateway]
// [Baremetal CIDR, Baremetal Start IP, Baremetal End IP,
// Ironic Start IP, Ironic End IP, Ironic Gateway]
var storageValues = ['192.168.1.0/24', '192.168.1.1', '192.168.1.50', '192.168.1.52',
'192.168.1.254', '192.168.1.51'];
var managementValues = ['192.168.0.0/24', '192.168.0.1', '192.168.0.50', '192.168.0.52',
@ -109,9 +111,9 @@ registerSuite(() => {
var publicValues = ['172.16.0.0/24', '172.16.0.1', '172.16.0.50', '172.16.0.51',
'172.16.0.254', '172.16.0.52'];
return this.remote
.then(() => networksLib.checkBaremetalIntersection('storage', storageValues))
.then(() => networksLib.checkBaremetalIntersection('management', managementValues))
.then(() => networksLib.checkBaremetalIntersection('public', publicValues));
.then(() => baremetalNetwork.checkBaremetalIntersection('storage', storageValues))
.then(() => baremetalNetwork.checkBaremetalIntersection('management', managementValues))
.then(() => baremetalNetwork.checkBaremetalIntersection('public', publicValues));
},
'Baremetal Network "Use VLAN tagging" option works'() {
var chboxVlanSelector = baremetalSelector + 'div.vlan_start input[type="checkbox"]';
@ -159,7 +161,7 @@ registerSuite(() => {
.assertElementEnabled(btnSaveSelector, 'Save Settings button is enabled')
// Cancel changes
.then(() => networksLib.cancelChanges())
.then(() => networksLib.checkNetworkInitialState(networkName));
.then(() => baremetalNetwork.checkNetworkInitialState());
},
'Baremetal Network "CIDR" field validation'() {
var cidrErrorSelector = baremetalSelector + 'div.cidr div.has-error span[class^="help"]';
@ -192,11 +194,11 @@ registerSuite(() => {
.then(() => networksLib.checkMultirackVerification())
// Cancel changes
.then(() => networksLib.cancelChanges())
.then(() => networksLib.checkNetworkInitialState(networkName));
.then(() => baremetalNetwork.checkNetworkInitialState());
},
'Baremetal Network "Use the whole CIDR" option works'() {
return this.remote
.then(() => networksLib.checkCidrOption(networkName))
.then(() => baremetalNetwork.checkCidrOption())
.then(() => networksLib.cancelChanges());
},
'Combinations ironic role with other roles validation'() {
@ -212,30 +214,24 @@ registerSuite(() => {
// Select node
.then(() => clusterPage.checkNodes(nodesAmount))
.then(() => clusterPage.checkNodeRoles(['Ironic']))
.assertElementExists(selectedIronicRoleSelector,
'Selected role has checkbox icon')
.assertElementExists(selectedIronicRoleSelector, 'Selected role has checkbox icon')
.assertElementExists('.role-block.compute.unavailable',
'Compute role can not be added together with selected roles')
.assertElementEnabled(applyButtonSelector,
'Apply button is enabled')
.assertElementEnabled(applyButtonSelector, 'Apply button is enabled')
.then(() => equipmentLib.uncheckNodeRoles())
// Check Ironic + Compute roles are available
.then(() => clusterPage.checkNodeRoles(['Ironic', 'Controller']))
.assertElementExists(selectedIronicRoleSelector,
'Selected role has checkbox icon')
.assertElementExists(selectedIronicRoleSelector, 'Selected role has checkbox icon')
.assertElementExists('.role-block.controller i.glyphicon-selected-role',
'Selected role has checkbox icon')
.assertElementEnabled(applyButtonSelector,
'Apply button is enabled')
.assertElementEnabled(applyButtonSelector, 'Apply button is enabled')
.then(() => equipmentLib.uncheckNodeRoles())
// Check Ironic + Ceph roles are available
.then(() => clusterPage.checkNodeRoles(['Ironic', 'Ceph OSD']))
.assertElementExists(selectedIronicRoleSelector,
'Selected role has checkbox icon')
.assertElementExists(selectedIronicRoleSelector, 'Selected role has checkbox icon')
.assertElementExists('.role-block.ceph-osd i.glyphicon-selected-role',
'Selected role has checkbox icon')
.assertElementEnabled(applyButtonSelector,
'Apply button is enabled')
.assertElementEnabled(applyButtonSelector, 'Apply button is enabled')
.then(() => equipmentLib.uncheckNodeRoles());
},
'Disabling ironic service'() {
@ -252,8 +248,7 @@ registerSuite(() => {
.clickByCssSelector(addNodeButtonSelector)
.waitForElementDeletion(addNodeButtonSelector, 3000)
.assertElementsAppear('.node', 3000, 'Unallocated nodes loaded')
.assertElementExists('.role-block.ironic.unavailable',
'Ironic role is unlocked');
.assertElementExists('.role-block.ironic.unavailable', 'Ironic role is unlocked');
}
};
});

View File

@ -20,6 +20,7 @@ import Common from 'tests/functional/pages/common';
import ClusterPage from 'tests/functional/pages/cluster';
import DashboardPage from 'tests/functional/pages/dashboard';
import Command from 'intern/dojo/node!leadfoot/Command';
import GenericNetworksLib from 'tests/functional/nightly/library/networks_generic';
import NetworksLib from 'tests/functional/nightly/library/networks';
registerSuite(() => {
@ -30,7 +31,7 @@ registerSuite(() => {
setup() {
common = new Common(this.remote);
clusterPage = new ClusterPage(this.remote);
networksLib = new NetworksLib(this.remote);
networksLib = new GenericNetworksLib(this.remote);
clusterName = common.pickRandomName('Tunneling Cluster');
return this.remote
@ -56,22 +57,22 @@ registerSuite(() => {
.then(() => networksLib.createNetworkGroup('Network_Group_1'))
.then(() => networksLib.createNetworkGroup('Network_Group_2'))
.then(() => networksLib.checkVLANs('Network_Group_2', 'VLAN'))
.then(() => networksLib.gotoNodeNetworkSubTab('Network_Group_1'))
.then(() => networksLib.goToNodeNetworkSubTab('Network_Group_1'))
.then(() => networksLib.checkVLANs('Network_Group_1', 'VLAN'))
.then(() => networksLib.gotoNodeNetworkSubTab('default'))
.then(() => networksLib.goToNodeNetworkSubTab('default'))
.then(() => networksLib.checkVLANs('default', 'VLAN'));
},
'Gateways appear for two or more node network groups'() {
return this.remote
.then(() => networksLib.gotoNodeNetworkSubTab('Network_Group_2'))
.then(() => networksLib.goToNodeNetworkSubTab('Network_Group_2'))
.then(() => networksLib.checkGateways('Network_Group_2', 'VLAN'))
.then(() => networksLib.gotoNodeNetworkSubTab('Network_Group_1'))
.then(() => networksLib.goToNodeNetworkSubTab('Network_Group_1'))
.then(() => networksLib.checkGateways('Network_Group_1', 'VLAN'))
.then(() => networksLib.gotoNodeNetworkSubTab('default'))
.then(() => networksLib.goToNodeNetworkSubTab('default'))
.then(() => networksLib.checkGateways('default', 'VLAN'))
.then(() => networksLib.gotoNodeNetworkSubTab('Network_Group_1'))
.then(() => networksLib.goToNodeNetworkSubTab('Network_Group_1'))
.then(() => networksLib.deleteNetworkGroup('Network_Group_1'))
.then(() => networksLib.checkDefaultNetGroup())
.then(() => networksLib.checkDefaultNetworkGroup())
.then(() => networksLib.checkGateways('default', 'VLAN'))
.assertElementEnabled('div.public input[name="gateway"]',
'Public "Gateway" field exists and enabled for "default" network group');
@ -80,7 +81,8 @@ registerSuite(() => {
});
registerSuite(() => {
var common, command, modal, clusterPage, clusterName, networksLib, dashboardPage;
var common, command, modal, clusterPage, clusterName, networksLib, publicNetwork, storageNetwork,
managementNetwork, dashboardPage;
var networkName = 'Public';
var publicSelector = 'div.' + networkName.toLowerCase() + ' ';
var ipRangesSelector = publicSelector + 'div.ip_ranges ';
@ -102,7 +104,10 @@ registerSuite(() => {
command = new Command(this.remote);
modal = new ModalWindow(this.remote);
clusterPage = new ClusterPage(this.remote);
networksLib = new NetworksLib(this.remote);
networksLib = new GenericNetworksLib(this.remote);
publicNetwork = new NetworksLib(this.remote, 'public');
storageNetwork = new NetworksLib(this.remote, 'storage');
managementNetwork = new NetworksLib(this.remote, 'management');
dashboardPage = new DashboardPage(this.remote);
clusterName = common.pickRandomName('VLAN Cluster');
@ -184,7 +189,6 @@ registerSuite(() => {
var invalidInputMessage = '.dns_nameservers .field-list .help-block.field-error';
return this.remote
.clickByCssSelector('.subtab-link-neutron_l3')
// Sleep is needed to transition for "Neutron L3" subtab
.waitForCssSelector(addFieldButton, 500)
.assertElementsExist(addFieldButton, 2, '"add field" buttons should exist')
.clickByCssSelector(removeFieldButton)
@ -211,7 +215,6 @@ registerSuite(() => {
// Sleep is needed to wait when regex check will done.
.sleep(300)
.type('8')
// Sleep is needed to wait when regex check will done.
.sleep(300)
.end()
.assertElementDisappears(fieldWithError, 500, 'The error message has dissappeared')
@ -225,7 +228,6 @@ registerSuite(() => {
var invalidInputMessage = fieldWithError + ' .help-block.field-error';
return this.remote
.clickByCssSelector('.subtab-link-network_settings')
// Sleep is needed to transition for "Other" subtab
.waitForCssSelector(addFieldButton, 500)
.assertElementsExist(addFieldButton, 2, '"add field" buttons should exist')
.clickByCssSelector(removeFieldButton)
@ -247,7 +249,6 @@ registerSuite(() => {
// Sleep is needed to wait when regexp check will done.
.sleep(300)
.type('8')
// Sleep is needed to wait when regexp check will done.
.sleep(300)
.end()
.assertElementDisappears(fieldWithError, 500, 'The error message has dissappeared')
@ -257,32 +258,32 @@ registerSuite(() => {
},
'Node network group deletion'() {
return this.remote
.then(() => networksLib.gotoNodeNetworkSubTab('default'))
.then(() => networksLib.goToNodeNetworkSubTab('default'))
.assertElementNotExists('.glyphicon-remove',
'It is not possible to delete default node network group')
.assertElementContainsText('span.explanation',
'This node network group uses a shared admin network and cannot be deleted',
'Default node network group description presented')
.then(() => networksLib.selectAllNetworksCheckbox(true))
.then(() => networksLib.selectAllNetworks(true))
.then(() => networksLib.deleteNetworkGroup('Network_Group_1'));
},
'Default network group the first in a list'() {
this.timeout = 45000;
return this.remote
.then(() => networksLib.createNetworkGroup('test'))
.then(() => networksLib.checkDefaultNetGroup())
.then(() => networksLib.selectAllNetworksCheckbox(true))
.then(() => networksLib.checkDefaultNetworkGroup())
.then(() => networksLib.selectAllNetworks(true))
.then(() => networksLib.checkMergedNetworksGrouping(['default', 'test']))
.then(() => networksLib.createNetworkGroup('abc'))
.then(() => networksLib.checkMergedNetworksGrouping(['default', 'test', 'abc']))
.then(() => networksLib.selectAllNetworksCheckbox(false))
.then(() => networksLib.checkDefaultNetGroup())
.then(() => networksLib.selectAllNetworks(false))
.then(() => networksLib.checkDefaultNetworkGroup())
.then(() => networksLib.createNetworkGroup('1234'))
.then(() => networksLib.checkDefaultNetGroup())
.then(() => networksLib.checkDefaultNetworkGroup())
.then(() => networksLib.createNetworkGroup('yrter'))
.then(() => networksLib.checkDefaultNetGroup())
.then(() => networksLib.checkDefaultNetworkGroup())
.then(() => networksLib.createNetworkGroup('+-934847fdjfjdbh'))
.then(() => networksLib.checkDefaultNetGroup());
.then(() => networksLib.checkDefaultNetworkGroup());
},
'Check that user returns to merged "All Networks" segment'() {
this.timeout = 45000;
@ -290,7 +291,7 @@ registerSuite(() => {
var allNetworksSelector = 'li[class="all"]';
return this.remote
.then(() => networksLib.checkNetworksGrouping(networkNames))
.then(() => networksLib.selectAllNetworksCheckbox(true))
.then(() => networksLib.selectAllNetworks(true))
// Check after refreshing of page
.then(() => networksLib.checkMergedNetworksGrouping(networkNames))
.then(() => command.refresh())
@ -313,15 +314,15 @@ registerSuite(() => {
.then(() => clusterPage.goToTab('Networks'))
.then(() => networksLib.checkMergedNetworksGrouping(networkNames))
// Check after switching between "Networks" segments
.then(() => networksLib.gotoNodeNetworkSubTab('Neutron L2'))
.then(() => networksLib.goToNodeNetworkSubTab('Neutron L2'))
.assertElementsExist(allNetworksSelector, '"All Networks" segment exists and not selected')
.then(() => networksLib.gotoNodeNetworkSubTab('Neutron L3'))
.then(() => networksLib.goToNodeNetworkSubTab('Neutron L3'))
.assertElementsExist(allNetworksSelector, '"All Networks" segment exists and not selected')
.then(() => networksLib.gotoNodeNetworkSubTab('Other'))
.then(() => networksLib.goToNodeNetworkSubTab('Other'))
.assertElementsExist(allNetworksSelector, '"All Networks" segment exists and not selected')
.then(() => networksLib.gotoNodeNetworkSubTab('Connectivity Check'))
.then(() => networksLib.goToNodeNetworkSubTab('Connectivity Check'))
.assertElementsExist(allNetworksSelector, '"All Networks" segment exists and not selected')
.then(() => networksLib.selectAllNetworksCheckbox(false));
.then(() => networksLib.selectAllNetworks(false));
},
'Check that "Show All Networks" checkbox worked as expected'() {
var newIpRangeStart = '172.16.0.10';
@ -334,14 +335,14 @@ registerSuite(() => {
var ipEndSelector = lastRangeSelector + 'input[name*="range-end"]';
return this.remote
// Check default values
.then(() => networksLib.gotoNodeNetworkSubTab('default'))
.then(() => networksLib.checkNetworkInitialState(networkName))
.then(() => networksLib.checkNetworkInitialState('Storage'))
.then(() => networksLib.checkNetworkInitialState('Management'))
.then(() => networksLib.selectAllNetworksCheckbox(true))
.then(() => networksLib.checkNetworkInitialState(networkName))
.then(() => networksLib.checkNetworkInitialState('Storage'))
.then(() => networksLib.checkNetworkInitialState('Management'))
.then(() => networksLib.goToNodeNetworkSubTab('default'))
.then(() => publicNetwork.checkNetworkInitialState())
.then(() => storageNetwork.checkNetworkInitialState())
.then(() => managementNetwork.checkNetworkInitialState())
.then(() => networksLib.selectAllNetworks(true))
.then(() => publicNetwork.checkNetworkInitialState())
.then(() => storageNetwork.checkNetworkInitialState())
.then(() => managementNetwork.checkNetworkInitialState())
// Check changed settings
.setInputValue(startIpSelector, newIpRangeStart)
.assertElementPropertyEquals(startIpSelector, 'value', newIpRangeStart,
@ -355,19 +356,19 @@ registerSuite(() => {
.assertElementPropertyEquals(testGroupSelector + ipEndSelector, 'placeholder',
defaultPlaceholder,
'"test" group Public new "End IP Range" textfield has default placeholder at merged pane')
.then(() => networksLib.selectAllNetworksCheckbox(false))
.then(() => networksLib.selectAllNetworks(false))
.assertElementPropertyEquals(startIpSelector, 'value', newIpRangeStart,
'"default" group Public "End IP Range" textfield has correct new value')
.then(() => networksLib.gotoNodeNetworkSubTab('test'))
.then(() => networksLib.goToNodeNetworkSubTab('test'))
.assertElementsExist(rowRangeSelector, 2, 'Correct number of IP ranges exists')
.assertElementPropertyEquals(ipStartSelector, 'placeholder', defaultPlaceholder,
'"test" group Public new "Start IP Range" textfield has default placeholder')
.assertElementPropertyEquals(ipEndSelector, 'placeholder', defaultPlaceholder,
'"test" group Public new "End IP Range" textfield has default placeholder')
.then(() => networksLib.cancelChanges())
.then(() => networksLib.checkNetworkInitialState(networkName))
.then(() => networksLib.gotoNodeNetworkSubTab('default'))
.then(() => networksLib.checkNetworkInitialState(networkName));
.then(() => publicNetwork.checkNetworkInitialState())
.then(() => networksLib.goToNodeNetworkSubTab('default'))
.then(() => publicNetwork.checkNetworkInitialState());
},
'Deletion of several node network groups one after another'() {
this.timeout = 60000;
@ -376,10 +377,10 @@ registerSuite(() => {
.then(() => networksLib.deleteNetworkGroup('+-934847fdjfjdbh'))
.then(() => networksLib.deleteNetworkGroup('yrter'))
.then(() => networksLib.deleteNetworkGroup('1234'))
.then(() => networksLib.selectAllNetworksCheckbox(true))
.then(() => networksLib.selectAllNetworks(true))
.then(() => networksLib.deleteNetworkGroup('abc'))
.then(() => networksLib.checkMergedNetworksGrouping(['default', 'test']))
.then(() => networksLib.selectAllNetworksCheckbox(false))
.then(() => networksLib.selectAllNetworks(false))
.then(() => command.refresh())
.assertElementsAppear(explanationSelector, 5000, 'Page refreshed successfully')
.then(() => networksLib.checkNetworksGrouping(['default', 'test']))
@ -429,14 +430,14 @@ registerSuite(() => {
.setInputValue(startIpSelector, startIpChanged)
.assertElementEnabled(btnSaveSelector,
'"Save Settings" button is enabled for ' + group2Name)
.then(() => networksLib.gotoNodeNetworkSubTab(group1Name))
.then(() => networksLib.goToNodeNetworkSubTab(group1Name))
.assertElementNotExists(modalSelector, 'No new dialogs appear for ' + group1Name)
.assertElementNotExists(errorSelector, 'No errors are observed for ' + group1Name)
.assertElementPropertyEquals(startIpSelector, 'value', startIpDefault,
'Public "Start IP Range" textfield has default value for ' + group1Name)
.assertElementEnabled(btnSaveSelector,
'"Save Settings" button is enabled for ' + group1Name)
.then(() => networksLib.gotoNodeNetworkSubTab('default'))
.then(() => networksLib.goToNodeNetworkSubTab('default'))
.assertElementNotExists(modalSelector,
'No new dialogs appear for "default" node network group')
.assertElementNotExists(errorSelector,
@ -445,7 +446,7 @@ registerSuite(() => {
'Public "Start IP Range" textfield has default value for "default" node network group')
.assertElementEnabled(btnSaveSelector,
'"Save Settings" button is enabled for "default" node network group')
.then(() => networksLib.gotoNodeNetworkSubTab(group2Name))
.then(() => networksLib.goToNodeNetworkSubTab(group2Name))
.assertElementNotExists(modalSelector, 'No new dialogs appear for ' + group2Name)
.assertElementNotExists(errorSelector, 'No errors are observed for ' + group2Name)
.assertElementPropertyEquals(startIpSelector, 'value', startIpChanged,
@ -455,25 +456,25 @@ registerSuite(() => {
},
'The same VLAN for different node network groups'() {
return this.remote
.then(() => networksLib.gotoNodeNetworkSubTab('Network_Group_1'))
.then(() => networksLib.goToNodeNetworkSubTab('Network_Group_1'))
.then(() => networksLib.checkGateways('Network_Group_1', 'TUN'))
.then(() => networksLib.checkVLANs('Network_Group_1', 'TUN'))
.then(() => networksLib.gotoNodeNetworkSubTab('Network_Group_2'))
.then(() => networksLib.goToNodeNetworkSubTab('Network_Group_2'))
.then(() => networksLib.checkVLANs('Network_Group_2', 'TUN'))
.then(() => networksLib.gotoNodeNetworkSubTab('default'))
.then(() => networksLib.goToNodeNetworkSubTab('default'))
.then(() => networksLib.checkVLANs('default', 'TUN'));
},
'Gateways appear for two or more node network groups'() {
return this.remote
.then(() => networksLib.gotoNodeNetworkSubTab('Network_Group_2'))
.then(() => networksLib.goToNodeNetworkSubTab('Network_Group_2'))
.then(() => networksLib.checkGateways('Network_Group_2', 'TUN'))
.then(() => networksLib.gotoNodeNetworkSubTab('Network_Group_1'))
.then(() => networksLib.goToNodeNetworkSubTab('Network_Group_1'))
.then(() => networksLib.checkGateways('Network_Group_1', 'TUN'))
.then(() => networksLib.gotoNodeNetworkSubTab('default'))
.then(() => networksLib.goToNodeNetworkSubTab('default'))
.then(() => networksLib.checkGateways('default', 'TUN'))
.then(() => networksLib.gotoNodeNetworkSubTab('Network_Group_1'))
.then(() => networksLib.goToNodeNetworkSubTab('Network_Group_1'))
.then(() => networksLib.deleteNetworkGroup('Network_Group_1'))
.then(() => networksLib.checkDefaultNetGroup())
.then(() => networksLib.checkDefaultNetworkGroup())
.then(() => networksLib.checkGateways('default', 'TUN'))
.assertElementEnabled(gatewaySelector,
'Public "Gateway" field exists and enabled for "default" network group');
@ -485,7 +486,7 @@ registerSuite(() => {
var ipRangeEnd = '192.168.12.254';
var gatewayArray = '192.168.12.1';
return this.remote
.then(() => networksLib.gotoNodeNetworkSubTab('default'))
.then(() => networksLib.goToNodeNetworkSubTab('default'))
.assertElementEnabled('div.management div.cidr input[type="text"]',
'Management "CIDR" textfield is enabled')
.setInputValue('div.management div.cidr input[type="text"]', cidrValue)
@ -496,7 +497,7 @@ registerSuite(() => {
.assertElementPropertyEquals('div.management input[name="gateway"]',
'value', gatewayArray, 'Management "Gateway" textfield has true value')
.then(() => networksLib.saveSettings())
.then(() => networksLib.gotoNodeNetworkSubTab('Network_Group_2'))
.then(() => networksLib.goToNodeNetworkSubTab('Network_Group_2'))
.assertElementEnabled('div.storage div.cidr input[type="text"]',
'Storage "CIDR" textfield is enabled')
.setInputValue('div.storage div.cidr input[type="text"]', cidrValue)
@ -524,7 +525,7 @@ registerSuite(() => {
var ipRangeEnd = ['172.16.5.126', '172.16.5.254'];
var gatewayValue = '172.16.5.1';
return this.remote
.then(() => networksLib.gotoNodeNetworkSubTab('Network_Group_2'))
.then(() => networksLib.goToNodeNetworkSubTab('Network_Group_2'))
.assertElementEnabled('div.public div.cidr input[type="text"]',
'Public "CIDR" textfield is enabled')
.setInputValue('div.public div.cidr input[type="text"]', cidrArray[0])
@ -563,7 +564,7 @@ registerSuite(() => {
var newGroupSelector = 'div[data-name="' + reName + '"] ';
var errorRenameSelector = '.has-error.node-group-renaming ';
return this.remote
.then(() => networksLib.selectAllNetworksCheckbox(true))
.then(() => networksLib.selectAllNetworks(true))
// Can rename "default" node network group
.clickByCssSelector(groupDefaultSelector + pencilSelector)
.assertElementAppears(groupDefaultSelector + renameSelector, 1000,
@ -598,7 +599,7 @@ registerSuite(() => {
'New "' + reName + '"" network group name is shown')
// Postcondition check
.then(() => networksLib.checkMergedNetworksGrouping(networkNames))
.then(() => networksLib.selectAllNetworksCheckbox(false))
.then(() => networksLib.selectAllNetworks(false))
.then(() => networksLib.checkNetworksGrouping(networkNames));
},
'Correct bahaviour of long name for node network group'() {
@ -606,7 +607,7 @@ registerSuite(() => {
var newName = 'fgbhsjdkgbhsdjkbhsdjkbhfjkbhfbjhgjbhsfjgbhsfjgbhsg';
var activeSelector = networkGroupsSelector + ' li.active';
return this.remote
.then(() => networksLib.gotoNodeNetworkSubTab(oldName))
.then(() => networksLib.goToNodeNetworkSubTab(oldName))
.assertElementTextEquals(activeSelector, oldName,
oldName + ' node network group is selected')
.assertElementPropertyEquals(activeSelector, 'offsetHeight', '37',
@ -644,14 +645,14 @@ registerSuite(() => {
.assertElementsAppear(progressSelector, 5000, 'Deployment is started')
.assertElementDisappears(progressSelector, 45000, 'Deployment is finished')
.then(() => clusterPage.goToTab('Networks'))
.then(() => networksLib.selectAllNetworksCheckbox(true))
.then(() => networksLib.selectAllNetworks(true))
// Can add new node network group after deployment
.then(() => networksLib.createNetworkGroup(newName))
// Can rename new node network group after deployment
.then(() => networksLib.renameNetworkGroup(newName, editName))
// Postcondition check
.then(() => networksLib.checkMergedNetworksGrouping(netNames))
.then(() => networksLib.selectAllNetworksCheckbox(false))
.then(() => networksLib.selectAllNetworks(false))
.then(() => networksLib.checkNetworksGrouping(netNames));
}
};

View File

@ -20,17 +20,15 @@ import ClusterPage from 'tests/functional/pages/cluster';
import NetworksLib from 'tests/functional/nightly/library/networks';
registerSuite(() => {
var common,
clusterPage,
clusterName,
networksLib;
var common, clusterPage, clusterName, storageNetwork, managementNetwork;
return {
name: 'Neutron VLAN segmentation',
setup() {
common = new Common(this.remote);
clusterPage = new ClusterPage(this.remote);
networksLib = new NetworksLib(this.remote);
storageNetwork = new NetworksLib(this.remote, 'storage');
managementNetwork = new NetworksLib(this.remote, 'management');
clusterName = common.pickRandomName('VLAN Cluster');
return this.remote
@ -42,71 +40,49 @@ registerSuite(() => {
},
'Storage Network "IP Ranges" testing'() {
this.timeout = 45000;
var networkName = 'Storage';
var correctIpRange = ['192.168.1.5', '192.168.1.10'];
var newIpRange = ['192.168.1.25', '192.168.1.30'];
return this.remote
.then(() => networksLib.checkNetworkInitialState(networkName))
.then(() => networksLib.checkNetrworkIpRanges(networkName, correctIpRange, newIpRange));
.then(() => storageNetwork.checkNetworkInitialState())
.then(() => storageNetwork.checkIPRanges(correctIpRange, newIpRange));
},
'Management Network "IP Ranges" testing'() {
this.timeout = 45000;
var networkName = 'Management';
var correctIpRange = ['192.168.0.55', '192.168.0.100'];
var newIpRange = ['192.168.0.120', '192.168.0.170'];
return this.remote
.then(() => networksLib.checkNetworkInitialState(networkName))
.then(() => networksLib.checkNetrworkIpRanges(networkName, correctIpRange, newIpRange));
.then(() => managementNetwork.checkNetworkInitialState())
.then(() => managementNetwork.checkIPRanges(correctIpRange, newIpRange));
},
'Check intersections between all networks'() {
this.timeout = 45000;
/// Network values to cause intersection with other network: [CIDR, Start IP, End IP]
var storageValues1 = ['192.168.0.0/24', '192.168.0.1', '192.168.0.254'];
var storageValues2 = ['172.16.0.0/24', '172.16.0.5', '172.16.0.120'];
var storageValues3 = ['172.16.0.0/24', '172.16.0.135', '172.16.0.170'];
var managementValues1 = ['172.16.0.0/24', '172.16.0.5', '172.16.0.120'];
var managementValues2 = ['172.16.0.0/24', '172.16.0.135', '172.16.0.170'];
return this.remote
// Storage and Management
.then(
() => networksLib.checkNerworksIntersection(
'Storage', 'Management', ['192.168.0.0/24', '192.168.0.1', '192.168.0.254']
)
)
// Storage and Public
.then(
() => networksLib.checkNerworksIntersection(
'Storage', 'Public', ['172.16.0.0/24', '172.16.0.5', '172.16.0.120']
)
)
// Storage and Floating IP
.then(
() => networksLib.checkNerworksIntersection(
'Storage', 'Public', ['172.16.0.0/24', '172.16.0.135', '172.16.0.170']
)
)
// Management and Public
.then(
() => networksLib.checkNerworksIntersection(
'Management', 'Public', ['172.16.0.0/24', '172.16.0.5', '172.16.0.120']
)
)
// Management and Floating IP
.then(
() => networksLib.checkNerworksIntersection(
'Management', 'Public', ['172.16.0.0/24', '172.16.0.135', '172.16.0.170']
)
);
.then(() => storageNetwork.checkNetworksIntersection('Management', storageValues1))
.then(() => storageNetwork.checkNetworksIntersection('Public', storageValues2))
.then(() => storageNetwork.checkNetworksIntersection('Public', storageValues3))
.then(() => managementNetwork.checkNetworksIntersection('Public', managementValues1))
.then(() => managementNetwork.checkNetworksIntersection('Public', managementValues2));
}
};
});
registerSuite(() => {
var common,
clusterPage,
clusterName,
networksLib;
var common, clusterPage, clusterName, storageNetwork, managementNetwork, privateNetwork;
return {
name: 'Neutron tunneling segmentation',
setup() {
common = new Common(this.remote);
clusterPage = new ClusterPage(this.remote);
networksLib = new NetworksLib(this.remote);
storageNetwork = new NetworksLib(this.remote, 'storage');
managementNetwork = new NetworksLib(this.remote, 'management');
privateNetwork = new NetworksLib(this.remote, 'private');
clusterName = common.pickRandomName('Tunneling Cluster');
return this.remote
@ -129,82 +105,48 @@ registerSuite(() => {
},
'Storage Network "IP Ranges" testing'() {
this.timeout = 45000;
var networkName = 'Storage';
var correctIpRange = ['192.168.1.5', '192.168.1.10'];
var newIpRange = ['192.168.1.25', '192.168.1.30'];
return this.remote
.then(() => networksLib.checkNetworkInitialState(networkName))
.then(() => networksLib.checkNetrworkIpRanges(networkName, correctIpRange, newIpRange));
.then(() => storageNetwork.checkNetworkInitialState())
.then(() => storageNetwork.checkIPRanges(correctIpRange, newIpRange));
},
'Management Network "IP Ranges" testing'() {
this.timeout = 45000;
var networkName = 'Management';
var correctIpRange = ['192.168.0.55', '192.168.0.100'];
var newIpRange = ['192.168.0.120', '192.168.0.170'];
return this.remote
.then(() => networksLib.checkNetworkInitialState(networkName))
.then(() => networksLib.checkNetrworkIpRanges(networkName, correctIpRange, newIpRange));
.then(() => managementNetwork.checkNetworkInitialState())
.then(() => managementNetwork.checkIPRanges(correctIpRange, newIpRange));
},
'Private Network "IP Ranges" testing'() {
this.timeout = 45000;
var networkName = 'Private';
var correctIpRange = ['192.168.2.190', '192.168.2.200'];
var newIpRange = ['192.168.2.200', '192.168.2.230'];
return this.remote
.then(() => networksLib.checkNetworkInitialState(networkName))
.then(() => networksLib.checkNetrworkIpRanges(networkName, correctIpRange, newIpRange));
.then(() => privateNetwork.checkNetworkInitialState())
.then(() => privateNetwork.checkIPRanges(correctIpRange, newIpRange));
},
'Check intersections between all networks'() {
this.timeout = 60000;
// Network values to cause intersection with other network: [CIDR, Start IP, End IP]
var storageValues1 = ['192.168.0.0/24', '192.168.0.1', '192.168.0.254'];
var storageValues2 = ['192.168.2.0/24', '192.168.2.1', '192.168.2.254'];
var storageValues3 = ['172.16.0.0/24', '172.16.0.5', '172.16.0.120'];
var storageValues4 = ['172.16.0.0/24', '172.16.0.135', '172.16.0.170'];
var managementValues1 = ['172.16.0.0/24', '172.16.0.5', '172.16.0.120'];
var managementValues2 = ['172.16.0.0/24', '172.16.0.135', '172.16.0.170'];
var privateValues1 = ['172.16.0.0/24', '172.16.0.5', '172.16.0.120'];
var privateValues2 = ['172.16.0.0/24', '172.16.0.135', '172.16.0.170'];
return this.remote
// Storage and Management
.then(
() => networksLib.checkNerworksIntersection(
'Storage', 'Management', ['192.168.0.0/24', '192.168.0.1', '192.168.0.254']
)
)
// Storage and Private
.then(
() => networksLib.checkNerworksIntersection(
'Storage', 'Private', ['192.168.2.0/24', '192.168.2.1', '192.168.2.254']
)
)
// Storage and Public
.then(
() => networksLib.checkNerworksIntersection(
'Storage', 'Public', ['172.16.0.0/24', '172.16.0.5', '172.16.0.120']
)
)
// Storage and Floating IP
.then(
() => networksLib.checkNerworksIntersection(
'Storage', 'Public', ['172.16.0.0/24', '172.16.0.135', '172.16.0.170']
)
)
// Management and Public
.then(
() => networksLib.checkNerworksIntersection(
'Management', 'Public', ['172.16.0.0/24', '172.16.0.5', '172.16.0.120']
)
)
// Management and Floating IP
.then(
() => networksLib.checkNerworksIntersection(
'Management', 'Public', ['172.16.0.0/24', '172.16.0.135', '172.16.0.170']
)
)
// Private and Public
.then(
() => networksLib.checkNerworksIntersection(
'Private', 'Public', ['172.16.0.0/24', '172.16.0.5', '172.16.0.120']
)
)
// Private and Floating IP
.then(
() => networksLib.checkNerworksIntersection(
'Private', 'Public', ['172.16.0.0/24', '172.16.0.135', '172.16.0.170']
)
);
.then(() => storageNetwork.checkNetworksIntersection('Management', storageValues1))
.then(() => storageNetwork.checkNetworksIntersection('Private', storageValues2))
.then(() => storageNetwork.checkNetworksIntersection('Public', storageValues3))
.then(() => storageNetwork.checkNetworksIntersection('Public', storageValues4))
.then(() => managementNetwork.checkNetworksIntersection('Public', managementValues1))
.then(() => managementNetwork.checkNetworksIntersection('Public', managementValues2))
.then(() => privateNetwork.checkNetworksIntersection('Public', privateValues1))
.then(() => privateNetwork.checkNetworksIntersection('Public', privateValues2));
}
};
});

View File

@ -17,17 +17,22 @@
import registerSuite from 'intern!object';
import Common from 'tests/functional/pages/common';
import ClusterPage from 'tests/functional/pages/cluster';
import GenericNetworksLib from 'tests/functional/nightly/library/networks_generic';
import NetworksLib from 'tests/functional/nightly/library/networks';
registerSuite(() => {
var common, clusterPage, clusterName, networksLib;
var common, clusterPage, clusterName, networksLib, storageNetwork, publicNetwork,
managementNetwork;
return {
name: 'Neutron VLAN segmentation',
setup() {
common = new Common(this.remote);
clusterPage = new ClusterPage(this.remote);
networksLib = new NetworksLib(this.remote);
networksLib = new GenericNetworksLib(this.remote);
publicNetwork = new NetworksLib(this.remote, 'public');
storageNetwork = new NetworksLib(this.remote, 'storage');
managementNetwork = new NetworksLib(this.remote, 'management');
clusterName = common.pickRandomName('VLAN Cluster');
return this.remote
@ -72,18 +77,18 @@ registerSuite(() => {
},
'Check "Node Network Groups" segment on "Networks" tab'() {
return this.remote
.then(() => networksLib.gotoNodeNetworkSubTab('default'))
.then(() => networksLib.checkNetworkInitialState('Public'))
.then(() => networksLib.checkNetworkInitialState('Storage'))
.then(() => networksLib.checkNetworkInitialState('Management'));
.then(() => networksLib.goToNodeNetworkSubTab('default'))
.then(() => publicNetwork.checkNetworkInitialState())
.then(() => storageNetwork.checkNetworkInitialState())
.then(() => managementNetwork.checkNetworkInitialState());
},
'Check "Settings" segment on "Networks" tab'() {
return this.remote
.then(() => networksLib.checkNetrworkSettingsSegment('VLAN'));
.then(() => networksLib.checkNetworkSettingsSegment('VLAN'));
},
'Check "Network Verification" segment on "Networks" tab'() {
return this.remote
.then(() => networksLib.checkNetrworkVerificationSegment());
.then(() => networksLib.checkNetworkVerificationSegment());
},
'Success network verification exists only on "Network Verification" segment'() {
return this.remote
@ -96,7 +101,7 @@ registerSuite(() => {
'True message is observed')
.assertElementContainsText('div.alert-success', 'Your network is configured correctly',
'True msg observed')
.then(() => networksLib.gotoNodeNetworkSubTab('default'))
.then(() => networksLib.goToNodeNetworkSubTab('default'))
.assertElementNotExists('div.alert-success',
'No message about result of network verification on "default" subtab')
.clickByCssSelector('.subtab-link-neutron_l2')
@ -119,7 +124,7 @@ registerSuite(() => {
'Failed network verification presents on each subtab on "Networks" tab'() {
var gatewayValue = '172.16.0.2';
return this.remote
.then(() => networksLib.gotoNodeNetworkSubTab('default'))
.then(() => networksLib.goToNodeNetworkSubTab('default'))
.setInputValue('div.public input[name=gateway]', gatewayValue)
.clickByCssSelector('.subtab-link-network_verification')
.assertElementEnabled('.verify-networks-btn', '"Verify Networks" is enabled')
@ -129,7 +134,7 @@ registerSuite(() => {
.assertElementContainsText('div.alert-danger',
'Address intersection between public gateway and IP range of public network',
'True message is observed')
.then(() => networksLib.gotoNodeNetworkSubTab('default'))
.then(() => networksLib.goToNodeNetworkSubTab('default'))
.assertElementExists('div.alert-danger',
'Message about result of network verification on "default" subtab')
.assertElementContainsText('div.alert-danger',
@ -164,7 +169,8 @@ registerSuite(() => {
});
registerSuite(() => {
var common, clusterPage, clusterName, networksLib;
var common, clusterPage, clusterName, networksLib, storageNetwork, publicNetwork,
managementNetwork, privateNetwork;
return {
name: 'Neutron tunneling segmentation',
@ -172,7 +178,11 @@ registerSuite(() => {
common = new Common(this.remote);
clusterPage = new ClusterPage(this.remote);
clusterName = common.pickRandomName('Tunneling Cluster');
networksLib = new NetworksLib(this.remote);
networksLib = new GenericNetworksLib(this.remote);
publicNetwork = new NetworksLib(this.remote, 'public');
storageNetwork = new NetworksLib(this.remote, 'storage');
managementNetwork = new NetworksLib(this.remote, 'management');
privateNetwork = new NetworksLib(this.remote, 'private');
return this.remote
.then(() => common.getIn())
@ -196,18 +206,18 @@ registerSuite(() => {
'Node Network Groups', '"Node Network Groups" segment opens by default')
.assertElementTextEquals('ul.node_network_groups li.active', 'default',
'"default" node network group opens by default')
.then(() => networksLib.checkNetworkInitialState('Public'))
.then(() => networksLib.checkNetworkInitialState('Storage'))
.then(() => networksLib.checkNetworkInitialState('Management'))
.then(() => networksLib.checkNetworkInitialState('Private'));
.then(() => publicNetwork.checkNetworkInitialState())
.then(() => storageNetwork.checkNetworkInitialState())
.then(() => managementNetwork.checkNetworkInitialState())
.then(() => privateNetwork.checkNetworkInitialState());
},
'Check "Settings" segment on "Networks" tab'() {
return this.remote
.then(() => networksLib.checkNetrworkSettingsSegment('Tunnel'));
.then(() => networksLib.checkNetworkSettingsSegment('Tunnel'));
},
'Check "Network Verification" segment on "Networks" tab'() {
return this.remote
.then(() => networksLib.checkNetrworkVerificationSegment());
.then(() => networksLib.checkNetworkVerificationSegment());
}
};
});

View File

@ -20,25 +20,22 @@ import ClusterPage from 'tests/functional/pages/cluster';
import DashboardLib from 'tests/functional/nightly/library/dashboard';
import DashboardPage from 'tests/functional/pages/dashboard';
import Modal from 'tests/functional/pages/modal';
import NetworksLib from 'tests/functional/nightly/library/networks';
import GenericLib from 'tests/functional/nightly/library/generic';
import GenericNetworksLib from 'tests/functional/nightly/library/networks_generic';
import 'intern/dojo/node!leadfoot/Command';
import 'intern/dojo/node!leadfoot/Session';
import 'intern/chai!assert';
registerSuite(() => {
var common,
clusterPage,
dashboardPage,
dashboardLib,
modal,
networksLib,
clusterName;
var common, clusterPage, dashboardPage, dashboardLib, modal, generic, networksLib, clusterName;
var loadDeployedBtn = 'button.btn-load-deployed';
var cancelChgsBtn = 'button.btn-revert-changes';
var saveNetworksChangesButton = 'button.btn.apply-btn';
var saveSettingsChangesButton = 'button.btn-apply-changes';
var deployButton = '.deploy-btn';
var clusterStatus = '.cluster-info-value.status';
var dashboardTabSelector = 'div.dashboard-tab ';
var progressSelector = dashboardTabSelector + 'div.progress';
return {
name: 'Unlock "Settings" and "Networks" tabs',
setup() {
@ -47,7 +44,8 @@ registerSuite(() => {
dashboardPage = new DashboardPage(this.remote);
dashboardLib = new DashboardLib(this.remote);
modal = new Modal(this.remote);
networksLib = new NetworksLib(this.remote);
generic = new GenericLib(this.remote);
networksLib = new GenericNetworksLib(this.remote);
clusterName = common.pickRandomName('Test Cluster');
return this.remote
@ -78,7 +76,7 @@ registerSuite(() => {
.then(() => clusterPage.goToTab('Settings'))
.assertElementExists('div.row.changes-locked', '"Settings" tab attributes are diasabled')
.then(() => clusterPage.goToTab('Dashboard'))
.waitForElementDeletion('.progress', 10000);
.assertElementDisappears(progressSelector, 30000, 'Deployment is finished');
},
'Check "configuration changes warning" behavior in deploying dialog'() {
this.timeout = 60000;
@ -95,14 +93,14 @@ registerSuite(() => {
// Now check warning message for "Networking" changes
.then(() => clusterPage.goToTab('Networks'))
.clickByCssSelector('.subtab-link-network_settings')
.waitForCssSelector(checkBoxToChange, 500)
.waitForCssSelector(checkBoxToChange, 1000)
.clickByCssSelector(checkBoxToChange)
.waitForCssSelector(saveNetworksChangesButton, 500)
.waitForCssSelector(saveNetworksChangesButton, 1000)
.clickByCssSelector(saveNetworksChangesButton)
// wait a bit for updating elements on page
.waitForCssSelector(checkBoxToChange + '[value="true"]', 800)
.assertElementAppears(checkBoxToChange + ':enabled', 3000, 'Change is saved successfully')
.assertElementPropertyEquals(checkBoxToChange, 'value', 'true',
'checkbox "Assign public network to all nodes" is checked')
'"Assign public network to all nodes" checkbox is checked')
.then(() => clusterPage.goToTab('Dashboard'))
// Check that, after any changes for cluster in operational state,
// deploy button is available
@ -114,34 +112,34 @@ registerSuite(() => {
.then(() => dashboardLib.checkWarningContainsNote(configChangesWarning))
.then(() => dashboardPage.discardChanges())
// Verify that changes were discarded
.waitForElementDeletion('.changes-item', 500)
.waitForElementDeletion('.changes-item', 1000)
.then(() => clusterPage.goToTab('Networks'))
.clickByCssSelector('.subtab-link-network_settings')
.waitForCssSelector(checkBoxToChange, 500)
.waitForCssSelector(checkBoxToChange, 1000)
.assertElementPropertyEquals(checkBoxToChange, 'value', 'false',
'Networks changes were discarded')
// Now check the same with "Settings" changes
.then(() => clusterPage.goToTab('Settings'))
.waitForCssSelector('.subtab-link-openstack_services', 500)
.waitForCssSelector('.subtab-link-openstack_services', 1000)
.clickByCssSelector('.subtab-link-openstack_services')
.waitForCssSelector('input[name="sahara"]', 500)
.waitForCssSelector('input[name="sahara"]', 1000)
.clickByCssSelector('input[name="sahara"]')
.clickByCssSelector(saveSettingsChangesButton)
// wait a bit for updating elements on page
.waitForCssSelector('input[name="sahara"][value=true]', 800)
.assertElementAppears('input[name="sahara"]:enabled', 3000, 'Change is saved successfully')
.assertElementPropertyEquals('input[name*="sahara"]', 'value', 'true',
'checkbox is enabled')
'"Install Sahara" checkbox is enabled')
.then(() => clusterPage.goToTab('Dashboard'))
.assertElementContainsText('.changes-item', 'Changed environment configuration',
'List of changes contains message about Changes in environment configuration')
.then(() => dashboardLib.checkWarningContainsNote(configChangesWarning))
// Verify that changes were discarded
.then(() => dashboardPage.discardChanges())
.waitForElementDeletion('.changes-item', 500)
.waitForElementDeletion('.changes-item', 1000)
.then(() => clusterPage.goToTab('Settings'))
.waitForCssSelector('.subtab-link-openstack_services', 500)
.waitForCssSelector('.subtab-link-openstack_services', 1000)
.clickByCssSelector('.subtab-link-openstack_services')
.waitForCssSelector('input[name="sahara"]', 500)
.waitForCssSelector('input[name="sahara"]', 1000)
.assertElementPropertyEquals('input[name*="sahara"]', 'value', 'false',
'Settings changes were discarded');
},
@ -149,24 +147,24 @@ registerSuite(() => {
this.timeout = 60000;
var publicVlanChkbox = '.public input[type*="checkbox"][name*="vlan_start"]';
var publicVlanInput = '.public input[type="text"][name*="vlan_start"]';
var installIronicChkbox = 'input.form-control[label*="Install Ironic"]';
var ironicCheckbox = 'input.form-control[label*="Install Ironic"]';
return this.remote
// For the first check button on "Networks" tab
.then(() => clusterPage.goToTab('Networks'))
.then(() => networksLib.gotoNodeNetworkSubTab('default'))
.then(() => networksLib.goToNodeNetworkSubTab('default'))
.assertElementEnabled(loadDeployedBtn, '"Deploy button" exists')
.waitForCssSelector(cancelChgsBtn, 500)
.waitForCssSelector(cancelChgsBtn, 1000)
.assertElementDisabled(cancelChgsBtn, '"Cancel changes" button should be disabled')
.assertElementDisabled(saveNetworksChangesButton,
'"Save changes" button should be disabled')
.waitForCssSelector(publicVlanChkbox, 500)
.clickByCssSelector(publicVlanChkbox, 500)
.waitForCssSelector(publicVlanInput, 500)
.waitForCssSelector(publicVlanChkbox, 1000)
.clickByCssSelector(publicVlanChkbox, 1000)
.waitForCssSelector(publicVlanInput, 1000)
.setInputValue(publicVlanInput, '123')
.assertElementEnabled(saveNetworksChangesButton, '"Save changes" button should be enabled')
.clickByCssSelector(saveNetworksChangesButton)
// wait a bit for updating elements on page
.waitForCssSelector(publicVlanChkbox + '[value="123"]', 800)
.assertElementAppears(publicVlanChkbox + ':enabled', 3000, 'Change is saved successfully')
.assertElementPropertyEquals(publicVlanChkbox, 'value', '123', 'changes were saved')
// wait a bit for button would have loaded after page were updated
.waitForElementDeletion(loadDeployedBtn + ':disabled', 1000)
@ -178,21 +176,21 @@ registerSuite(() => {
.then(() => networksLib.saveSettings())
// Then check button on "Settings" tab
.then(() => clusterPage.goToTab('Settings'))
.waitForCssSelector('.subtab-link-openstack_services', 500)
.waitForCssSelector('.subtab-link-openstack_services', 1000)
.clickByCssSelector('.subtab-link-openstack_services')
.assertElementDisabled(cancelChgsBtn, '"Cancel changes" button should be disabled')
.assertElementDisabled(saveSettingsChangesButton,
'"Save changes" button should be disabled')
.clickByCssSelector(installIronicChkbox)
.clickByCssSelector(ironicCheckbox)
.clickByCssSelector(saveSettingsChangesButton)
// wait a bit for updating elements on page
.waitForCssSelector(installIronicChkbox + '[value="true"]', 1200)
.assertElementPropertyEquals(installIronicChkbox, 'value', 'true',
.assertElementAppears(ironicCheckbox + ':enabled', 3000, 'Change is saved successfully')
.assertElementPropertyEquals(ironicCheckbox, 'value', 'true',
'"Settings" changes were saved')
.clickByCssSelector(loadDeployedBtn)
// wait a bit for updating elements on page
.waitForCssSelector(installIronicChkbox + '[value="false"]', 1200)
.assertElementPropertyEquals(installIronicChkbox, 'value', 'false',
.assertElementAppears(ironicCheckbox + ':enabled', 3000, 'Change is saved successfully')
.assertElementPropertyEquals(ironicCheckbox, 'value', 'false',
'"Load defaults setting" button had discarded "Settings" changes')
.clickByCssSelector(saveSettingsChangesButton)
// Wait for changes apply
@ -203,6 +201,7 @@ registerSuite(() => {
var deploymentMethodToggle = '.dropdown-toggle';
var chooseProvisionNodesSelector = '.btn-group .dropdown-toggle';
var stopDeploymentButton = '.stop-deployment-btn';
var provisionButton = '.provision button';
return this.remote
// For the first check for cluster in "stopped" state
.then(() => common.addNodesToCluster(1, ['Compute']))
@ -210,7 +209,7 @@ registerSuite(() => {
.then(() => dashboardPage.startDeployment())
// Stop deployment process
.waitForCssSelector(stopDeploymentButton, 2000)
.waitForElementDeletion('.progress', 8000)
.waitForElementDeletion(progressSelector, 8000)
.then(() => dashboardPage.stopDeployment())
// wait a bit for updating status of cluster
.waitForCssSelector(deployButton, 15000)
@ -222,26 +221,25 @@ registerSuite(() => {
.then(() => clusterPage.resetEnvironment(clusterName))
.waitForCssSelector(deployButton, 10000)
.clickByCssSelector(deploymentMethodToggle)
.findByCssSelector('.provision button')
.then((element) => this.remote.moveMouseTo(element))
.click()
.end()
.waitForCssSelector(chooseProvisionNodesSelector, 500)
.then(() => generic.moveCursorTo(provisionButton))
.clickByCssSelector(provisionButton)
.waitForCssSelector(chooseProvisionNodesSelector, 1000)
.clickByCssSelector(chooseProvisionNodesSelector)
.waitForCssSelector('.btn-select-nodes', 500)
.waitForCssSelector('.btn-select-nodes', 1000)
.clickByCssSelector('.btn-select-nodes')
.then(() => modal.waitToOpen())
.then(() => modal.checkTitle('Select Nodes'))
.waitForCssSelector('.node.selected.pending_addition', 500)
.waitForCssSelector('.node.selected.pending_addition', 1000)
.clickByCssSelector('.node.selected.pending_addition')
.then(() => modal.clickFooterButton('Select 2 Nodes'))
.then(() => modal.waitToClose())
.waitForCssSelector('.btn-provision', 500)
.waitForCssSelector('.btn-provision', 1000)
.clickByCssSelector('.btn-provision')
.then(() => modal.waitToOpen())
.then(() => modal.checkTitle('Provision Nodes'))
.then(() => modal.clickFooterButton('Provision 2 Nodes'))
.waitForElementDeletion('.progress', 20000)
.assertElementAppears(progressSelector, 5000, 'Deployment is started')
.assertElementDisappears(progressSelector, 30000, 'Deployment is finished')
.waitForCssSelector(deployButton, 10000)
// Wait a bit while status of the cluster will have updated
.waitForElementDeletion(clusterStatus, 2000)