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:
parent
5684d7460e
commit
3226e8b915
|
@ -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
|
@ -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;
|
|
@ -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);
|
||||
|
|
|
@ -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());
|
||||
},
|
||||
|
|
|
@ -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');
|
||||
}
|
||||
};
|
||||
});
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
};
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
};
|
||||
});
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
};
|
||||
});
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue