diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java index b5aca5d9f10..5b27203a7dc 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java @@ -1336,7 +1336,7 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra //check if the there are no service provider other than virtualrouter. for(Provider provider : providers) { - if (provider!=Provider.VirtualRouter) + if (provider != Provider.VirtualRouter) throw new UnsupportedOperationException("Cannot update the network resources in sequence when providers other than virtualrouter are used"); } //check if routers are in correct state before proceeding with the update diff --git a/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java index d13234d1016..66f76387032 100644 --- a/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java +++ b/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java @@ -29,11 +29,11 @@ import java.util.Set; import javax.annotation.PostConstruct; import javax.inject.Inject; +import org.apache.log4j.Logger; + import com.cloud.network.Network; import com.cloud.network.dao.NetworkDao; import com.cloud.network.dao.NetworkVO; -import org.apache.log4j.Logger; - import com.cloud.server.ResourceTag.ResourceObjectType; import com.cloud.tags.dao.ResourceTagDao; import com.cloud.user.Account; @@ -368,9 +368,13 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use if (detailsStr == null) { return; } + + final Map visibilityMap = _detailsDao.listDetailsVisibility(vm.getId()); + List details = new ArrayList(); - for (String key : detailsStr.keySet()) { - details.add(new UserVmDetailVO(vm.getId(), key, detailsStr.get(key), true)); + for (Map.Entry entry : detailsStr.entrySet()) { + boolean display = visibilityMap.getOrDefault(entry.getKey(), true); + details.add(new UserVmDetailVO(vm.getId(), entry.getKey(), entry.getValue(), display)); } _detailsDao.saveDetails(details); diff --git a/engine/schema/src/org/apache/cloudstack/resourcedetail/ResourceDetailsDao.java b/engine/schema/src/org/apache/cloudstack/resourcedetail/ResourceDetailsDao.java index 5d2d919a685..3f340455bab 100644 --- a/engine/schema/src/org/apache/cloudstack/resourcedetail/ResourceDetailsDao.java +++ b/engine/schema/src/org/apache/cloudstack/resourcedetail/ResourceDetailsDao.java @@ -73,6 +73,8 @@ public interface ResourceDetailsDao extends GenericDao public Map listDetailsKeyPairs(long resourceId, boolean forDisplay); + Map listDetailsVisibility(long resourceId); + public void saveDetails(List details); public void addDetail(long resourceId, String key, String value, boolean display); diff --git a/engine/schema/src/org/apache/cloudstack/resourcedetail/ResourceDetailsDaoBase.java b/engine/schema/src/org/apache/cloudstack/resourcedetail/ResourceDetailsDaoBase.java index b3e7ea27587..7110541e3fc 100644 --- a/engine/schema/src/org/apache/cloudstack/resourcedetail/ResourceDetailsDaoBase.java +++ b/engine/schema/src/org/apache/cloudstack/resourcedetail/ResourceDetailsDaoBase.java @@ -27,7 +27,7 @@ import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.TransactionLegacy; -public abstract class ResourceDetailsDaoBase extends GenericDaoBase { +public abstract class ResourceDetailsDaoBase extends GenericDaoBase implements ResourceDetailsDao { private SearchBuilder AllFieldsSearch; public ResourceDetailsDaoBase() { @@ -81,6 +81,18 @@ public abstract class ResourceDetailsDaoBase extends G return details; } + public Map listDetailsVisibility(long resourceId) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("resourceId", resourceId); + + List results = search(sc, null); + Map details = new HashMap<>(results.size()); + for (R result : results) { + details.put(result.getName(), result.isDisplay()); + } + return details; + } + public List listDetails(long resourceId) { SearchCriteria sc = AllFieldsSearch.create(); sc.setParameters("resourceId", resourceId); diff --git a/server/src/com/cloud/network/element/VirtualRouterElement.java b/server/src/com/cloud/network/element/VirtualRouterElement.java index 9b481ed4a64..58d9343f633 100644 --- a/server/src/com/cloud/network/element/VirtualRouterElement.java +++ b/server/src/com/cloud/network/element/VirtualRouterElement.java @@ -24,14 +24,12 @@ import java.util.Set; import javax.inject.Inject; -import com.cloud.utils.net.NetUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import com.cloud.network.router.NetworkHelper; import org.apache.commons.collections.CollectionUtils; import org.apache.log4j.Logger; import org.cloud.network.router.deployment.RouterDeploymentDefinition; import org.cloud.network.router.deployment.RouterDeploymentDefinitionBuilder; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import com.google.gson.Gson; @@ -83,6 +81,7 @@ import com.cloud.network.dao.OvsProviderDao; import com.cloud.network.dao.VirtualRouterProviderDao; import com.cloud.network.lb.LoadBalancingRule; import com.cloud.network.lb.LoadBalancingRulesManager; +import com.cloud.network.router.NetworkHelper; import com.cloud.network.router.VirtualRouter; import com.cloud.network.router.VirtualRouter.Role; import com.cloud.network.router.VpcVirtualNetworkApplianceManager; @@ -103,6 +102,7 @@ import com.cloud.utils.crypt.DBEncryptionUtil; import com.cloud.utils.db.QueryBuilder; import com.cloud.utils.db.SearchCriteria.Op; import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.utils.net.NetUtils; import com.cloud.vm.DomainRouterVO; import com.cloud.vm.NicProfile; import com.cloud.vm.ReservationContext; @@ -703,7 +703,14 @@ NetworkMigrationResponder, AggregatedCommandExecutor, RedundantResource, DnsServ // save the password in DB for (final VirtualRouter router : routers) { if (router.getState() == State.Running) { - return networkTopology.savePasswordToRouter(network, nic, uservm, router); + final boolean result = networkTopology.savePasswordToRouter(network, nic, uservm, router); + if (result) { + // Explicit password reset, while VM hasn't generated a password yet. + final UserVmVO userVmVO = _userVmDao.findById(vm.getId()); + userVmVO.setUpdateParameters(false); + _userVmDao.update(userVmVO.getId(), userVmVO); + } + return result; } } final String password = (String) uservm.getParameter(VirtualMachineProfile.Param.VmPassword); diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 8e972155f80..7ba282f4b18 100644 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -39,6 +39,11 @@ import java.util.stream.Collectors; import javax.inject.Inject; import javax.naming.ConfigurationException; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.collections.MapUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Logger; + import org.apache.cloudstack.acl.ControlledEntity.ACLType; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.affinity.AffinityGroupService; @@ -91,10 +96,6 @@ import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao; import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO; -import org.apache.commons.codec.binary.Base64; -import org.apache.commons.collections.MapUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.log4j.Logger; import com.cloud.agent.AgentManager; import com.cloud.agent.api.Answer; @@ -688,10 +689,6 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir if (result) { userVm.setPassword(password); - // update the password in vm_details table too - // Check if an SSH key pair was selected for the instance and if so - // use it to encrypt & save the vm password - encryptAndStorePassword(userVm, password); } else { throw new CloudRuntimeException("Failed to reset password for the virtual machine "); } @@ -736,7 +733,6 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir } else { final UserVmVO userVm = _vmDao.findById(vmId); _vmDao.loadDetails(userVm); - userVm.setPassword(password); // update the password in vm_details table too // Check if an SSH key pair was selected for the instance and if so // use it to encrypt & save the vm password @@ -850,8 +846,9 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir userVm.setPassword(password); //update the encrypted password in vm_details table too encryptAndStorePassword(userVm, password); + } else { + _vmDao.saveDetails(userVm); } - _vmDao.saveDetails(userVm); if (vmInstance.getState() == State.Stopped) { s_logger.debug("Vm " + vmInstance + " is stopped, not rebooting it as a part of SSH Key reset"); @@ -4461,6 +4458,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir password = DBEncryptionUtil.decrypt(vm.getDetail("password")); } else { password = _mgr.generateRandomPassword(); + vm.setPassword(password); } } @@ -4499,11 +4497,10 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir // this value is not being sent to the backend; need only for api // display purposes if (template.getEnablePassword()) { - vm.setPassword((String)vmParamPair.second().get(VirtualMachineProfile.Param.VmPassword)); - vm.setUpdateParameters(false); if (vm.getDetail("password") != null) { - _vmDetailsDao.remove(_vmDetailsDao.findDetail(vm.getId(), "password").getId()); + _vmDetailsDao.removeDetail(vm.getId(), "password"); } + vm.setUpdateParameters(false); _vmDao.update(vm.getId(), vm); } } @@ -6180,7 +6177,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir vm.setUpdateParameters(false); _vmDao.loadDetails(vm); if (vm.getDetail("password") != null) { - _vmDetailsDao.remove(_vmDetailsDao.findDetail(vm.getId(), "password").getId()); + _vmDetailsDao.removeDetail(vm.getId(), "password"); } _vmDao.update(vm.getId(), vm); } diff --git a/test/integration/component/test_configdrive.py b/test/integration/component/test_configdrive.py index 3d4c7b5a52b..60d2c95e3b3 100644 --- a/test/integration/component/test_configdrive.py +++ b/test/integration/component/test_configdrive.py @@ -20,6 +20,8 @@ ConfigDrive """ # Import Local Modules +from contextlib import contextmanager + from marvin.cloudstackTestCase import cloudstackTestCase from marvin.cloudstackAPI import (resetSSHKeyForVirtualMachine, updateTemplate, @@ -214,6 +216,12 @@ class ConfigDriveUtils: self.password = password self.presence = True + @contextmanager + def stopped_vm(self, vm): + vm.stop(self.api_client) + yield + vm.start(self.api_client) + def updateTemplate(self, value): """Updates value of the guest VM template's password enabled setting """ @@ -439,7 +447,7 @@ class ConfigDriveUtils: ) self.assertEqual( str(metadata["local-hostname.txt"]), - vm.instancename, + vm.name, "vm name inside metadata does not match with the " "instance name" ) @@ -754,15 +762,28 @@ class ConfigDriveUtils: :rtype: str """ updated_user_data = base64.b64encode(new_user_data) - vm.update(self.api_client, userdata=updated_user_data) - return new_user_data + with self.stopped_vm(vm): + vm.update(self.api_client, userdata=updated_user_data) + return updated_user_data def reset_password(self, vm): - vm.password = vm.resetPassword(self.api_client) + """Resets the password of a VM + + :param vm: the Virtual Machine + :type vm: VirtualMachine + :returns: The new password + :rtype: str + """ + + with self.stopped_vm(vm): + vm.password = vm.resetPassword(self.api_client) + self.debug("Password reset to - %s" % vm.password) self.debug("VM - %s password - %s !" % (vm.name, vm.password)) + return vm.password + def wait_until_done(self, thread_list, name): for aThread in thread_list: self.debug("[Concurrency]Join %s for vm %s" % (name, @@ -774,14 +795,13 @@ class ConfigDriveUtils: :type vm: VirtualMachine """ - vm.stop(self.api_client) - vm_new_ssh = vm.resetSshKey(self.api_client, - keypair=self.keypair.name, - account=self.account.user[0].account, - domainid=self.account.domainid) + with self.stopped_vm(vm): + vm_new_ssh = vm.resetSshKey(self.api_client, + keypair=self.keypair.name, + account=self.account.user[0].account, + domainid=self.account.domainid) self.debug("Sshkey reset to - %s" % self.keypair.name) - vm.start(self.api_client) vm.details = vm_new_ssh.details @@ -1339,6 +1359,46 @@ class TestConfigDrive(cloudstackTestCase, ConfigDriveUtils): self.debug("No host available for migration. " "Test requires at-least 2 hosts") + # create_NetworkAclList - Creates network ACL list in the given VPC + def create_NetworkAclList(self, name, description, vpc): + self.debug("Adding NetworkACL list in VPC with ID - %s" % vpc.id) + return NetworkACLList.create(self.api_client, + services={}, + name=name, + description=description, + vpcid=vpc.id + ) + + # create_NetworkAclRule - Creates Ingress/Egress Network ACL rule in the + # given VPC network/acl list + def create_NetworkAclRule(self, rule, traffic_type="Ingress", network=None, + acl_list=None): + self.debug("Adding NetworkACL rule - %s" % rule) + if acl_list: + return NetworkACL.create(self.api_client, + networkid=network.id if network else None, + services=rule, + traffictype=traffic_type, + aclid=acl_list.id + ) + else: + return NetworkACL.create(self.api_client, + networkid=network.id if network else None, + services=rule, + traffictype=traffic_type + ) + + # restart_Vpc - Restarts the given VPC with/without cleanup + def restart_Vpc(self, vpc, cleanup=False): + self.debug("Restarting VPC with ID - %s" % vpc.id) + cmd = restartVPC.restartVPCCmd() + cmd.id = vpc.id + cmd.cleanup = cleanup + cmd.makeredundant = False + self.api_client.restartVPC(cmd) + self.debug("Restarted VPC with ID - %s" % vpc.id) + + @attr(tags=["advanced", "isonw"], required_hardware="true") def test_configdrive_isolated_network(self): """Test Configdrive as provider for isolated Networks @@ -1410,7 +1470,7 @@ class TestConfigDrive(cloudstackTestCase, ConfigDriveUtils): self.check_Router_state(vr, state="Running") # We need to have the vm password - vm1.password = vm1.resetPassword(self.api_client) + self.reset_password(vm1) self.debug("Password reset to - %s" % vm1.password) self.debug("VM - %s password - %s !" % (vm1.name, vm1.password)) @@ -1435,7 +1495,7 @@ class TestConfigDrive(cloudstackTestCase, ConfigDriveUtils): self.generate_ssh_keys() self.update_sshkeypair(vm1) # After sshkey reset we need to have the vm password again - vm1.password = vm1.resetPassword(self.api_client) + self.reset_password(vm1) self.debug("Password reset to - %s" % vm1.password) self.debug("VM - %s password - %s !" % (vm1.name, vm1.password)) @@ -1454,7 +1514,7 @@ class TestConfigDrive(cloudstackTestCase, ConfigDriveUtils): metadata=True, userdata=expected_user_data1, ssh_key=self.keypair) - vm1.password = vm1.resetPassword(self.api_client) + self.reset_password(vm1) self.debug("Password reset to - %s" % vm1.password) self.debug("VM - %s password - %s !" % (vm1.name, vm1.password)) @@ -1481,7 +1541,7 @@ class TestConfigDrive(cloudstackTestCase, ConfigDriveUtils): self.PasswordTest(False), metadata=True, userdata=expected_user_data1) - vm1.password = vm1.resetPassword(self.api_client) + self.reset_password(vm1) self.debug("Password reset to - %s" % vm1.password) self.debug("VM - %s password - %s !" % (vm1.name, vm1.password)) @@ -1535,7 +1595,7 @@ class TestConfigDrive(cloudstackTestCase, ConfigDriveUtils): create_network2.network, operation="remove") create_network2.network.delete(self.api_client) - vm1.password = vm1.resetPassword(self.api_client) + self.reset_password(vm1) self.debug("Password reset to - %s" % vm1.password) self.debug("VM - %s password - %s !" % (vm1.name, vm1.password)) @@ -1670,45 +1730,6 @@ class TestConfigDrive(cloudstackTestCase, ConfigDriveUtils): vm1.delete(self.api_client, expunge=True) create_network1.network.delete(self.api_client) - # create_NetworkAclList - Creates network ACL list in the given VPC - def create_NetworkAclList(self, name, description, vpc): - self.debug("Adding NetworkACL list in VPC with ID - %s" % vpc.id) - return NetworkACLList.create(self.api_client, - services={}, - name=name, - description=description, - vpcid=vpc.id - ) - - # create_NetworkAclRule - Creates Ingress/Egress Network ACL rule in the - # given VPC network/acl list - def create_NetworkAclRule(self, rule, traffic_type="Ingress", network=None, - acl_list=None): - self.debug("Adding NetworkACL rule - %s" % rule) - if acl_list: - return NetworkACL.create(self.api_client, - networkid=network.id if network else None, - services=rule, - traffictype=traffic_type, - aclid=acl_list.id - ) - else: - return NetworkACL.create(self.api_client, - networkid=network.id if network else None, - services=rule, - traffictype=traffic_type - ) - - # restart_Vpc - Restarts the given VPC with/without cleanup - def restart_Vpc(self, vpc, cleanup=False): - self.debug("Restarting VPC with ID - %s" % vpc.id) - cmd = restartVPC.restartVPCCmd() - cmd.id = vpc.id - cmd.cleanup = cleanup - cmd.makeredundant = False - self.api_client.restartVPC(cmd) - self.debug("Restarted VPC with ID - %s" % vpc.id) - @attr(tags=["advanced", "vpc"], required_hardware="true") def test_configdrive_vpc_network(self): """Test Configdrive for VPC Networks @@ -2188,20 +2209,14 @@ class TestConfigDrive(cloudstackTestCase, ConfigDriveUtils): self.check_Router_state(shared_vr, state="Running") # We need to have the vm password - vm1.password = vm1.resetPassword(self.api_client) - self.debug("Password reset to - %s" % vm1.password) - self.debug("VM - %s password - %s !" % - (vm1.name, vm1.password)) + self.reset_password(vm1) self.update_userdata(vm1, "helloworld vm1") self.debug("Adding a non-default nic to the VM " "making it a multi-nic VM...") self.nic_operation_VM(vm1, shared_network2.network, operation="add") - vm1.password = vm1.resetPassword(self.api_client) - self.debug("Password reset to - %s" % vm1.password) - self.debug("VM - %s password - %s !" % - (vm1.name, vm1.password)) + self.reset_password(vm1) self.debug("updating non-default nic as the default nic " "of the multi-nic VM...") @@ -2210,10 +2225,7 @@ class TestConfigDrive(cloudstackTestCase, ConfigDriveUtils): vm1.stop(self.api_client) vm1.start(self.api_client) - vm1.password = vm1.resetPassword(self.api_client) - self.debug("Password reset to - %s" % vm1.password) - self.debug("VM - %s password - %s !" % - (vm1.name, vm1.password)) + self.reset_password(vm1) self.update_userdata(vm1, "hellomultinicvm1") self.debug("Updating the default nic of the multi-nic VM, " @@ -2227,10 +2239,7 @@ class TestConfigDrive(cloudstackTestCase, ConfigDriveUtils): shared_network2.network, operation="remove") shared_network2.network.delete(self.api_client) # We need to have the vm password - vm1.password = vm1.resetPassword(self.api_client) - self.debug("Password reset to - %s" % vm1.password) - self.debug("VM - %s password - %s !" % - (vm1.name, vm1.password)) + self.reset_password(vm1) self.debug("+++ When template is not password enabled, " "verify configdrive of VM - %s" % vm1.name) diff --git a/test/integration/plugins/nuagevsp/nuageTestCase.py b/test/integration/plugins/nuagevsp/nuageTestCase.py index 9d842aa3a93..e07fb6426eb 100644 --- a/test/integration/plugins/nuagevsp/nuageTestCase.py +++ b/test/integration/plugins/nuagevsp/nuageTestCase.py @@ -17,8 +17,19 @@ """ Custom base class for Nuage VSP SDN plugin specific Marvin tests """ +import functools +import importlib +import logging +import socket + +import sys +import time # Import Local Modules from bambou.nurest_object import NURESTObject +from marvin.cloudstackAPI import (restartVPC, + enableNuageUnderlayVlanIpRange, + disableNuageUnderlayVlanIpRange, + listNuageUnderlayVlanIpRanges) from marvin.cloudstackTestCase import cloudstackTestCase, unittest from marvin.lib.base import (Domain, EgressFireWallRule, @@ -44,22 +55,10 @@ from marvin.lib.base import (Domain, from marvin.lib.common import (get_domain, get_template, get_zone) -from marvin.cloudstackAPI import (restartVPC, - enableNuageUnderlayVlanIpRange, - disableNuageUnderlayVlanIpRange, - listNuageUnderlayVlanIpRanges) - -from nuage_test_data import nuage_test_data -from nuage_vsp_statistics import VsdDataCollector - # Import System Modules from retry import retry -import importlib -import functools -import logging -import socket -import time -import sys + +from nuage_test_data import nuage_test_data class needscleanup(object): @@ -89,38 +88,6 @@ class needscleanup(object): return _wrapper -class gherkin(object): - """Decorator to mark a method as Gherkin style. - Add extra colored logging - """ - BLACK = "\033[0;30m" - BLUE = "\033[0;34m" - GREEN = "\033[0;32m" - CYAN = "\033[0;36m" - RED = "\033[0;31m" - BOLDBLUE = "\033[1;34m" - NORMAL = "\033[0m" - - def __init__(self, method): - self.method = method - - def __get__(self, obj=None, objtype=None): - @functools.wraps(self.method) - def _wrapper(*args, **kwargs): - gherkin_step = self.method.__name__.replace("_", " ").capitalize() - obj.info("=G= %s%s%s" % (self.BOLDBLUE, gherkin_step, self.NORMAL)) - try: - result = self.method(obj, *args, **kwargs) - obj.info("=G= %s%s: [SUCCESS]%s" % - (self.GREEN, gherkin_step, self.NORMAL)) - return result - except Exception as e: - obj.info("=G= %s%s: [FAILED]%s%s" % - (self.RED, gherkin_step, self.NORMAL, e)) - raise - return _wrapper - - class nuageTestCase(cloudstackTestCase): @classmethod @@ -825,7 +792,7 @@ class nuageTestCase(cloudstackTestCase): name=provider_name, physicalnetworkid=self.vsp_physical_network.id ) - self.assertEqual(isinstance(providers, list), True, + self.assertIsInstance(providers, list, "List Network Service Provider should return a " "valid list" ) diff --git a/test/integration/plugins/nuagevsp/nuage_lib.py b/test/integration/plugins/nuagevsp/nuage_lib.py index fc14d297518..d12b3edacb6 100644 --- a/test/integration/plugins/nuagevsp/nuage_lib.py +++ b/test/integration/plugins/nuagevsp/nuage_lib.py @@ -14,6 +14,7 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. +import functools from marvin.cloudstackAPI import createSSHKeyPair, deleteSSHKeyPair @@ -44,4 +45,36 @@ class MySSHKeyPair: cmd.name = self.name cmd.account = self.account cmd.domainid = self.domainid - apiclient.deleteSSHKeyPair(cmd) \ No newline at end of file + apiclient.deleteSSHKeyPair(cmd) + + +class gherkin(object): + """Decorator to mark a method as Gherkin style. + Add extra colored logging + """ + BLACK = "\033[0;30m" + BLUE = "\033[0;34m" + GREEN = "\033[0;32m" + CYAN = "\033[0;36m" + RED = "\033[0;31m" + BOLDBLUE = "\033[1;34m" + NORMAL = "\033[0m" + + def __init__(self, method): + self.method = method + + def __get__(self, obj=None, objtype=None): + @functools.wraps(self.method) + def _wrapper(*args, **kwargs): + gherkin_step = self.method.__name__.replace("_", " ").capitalize() + obj.info("=G= %s%s%s" % (self.BOLDBLUE, gherkin_step, self.NORMAL)) + try: + result = self.method(obj, *args, **kwargs) + obj.info("=G= %s%s: [SUCCESS]%s" % + (self.GREEN, gherkin_step, self.NORMAL)) + return result + except Exception as e: + obj.info("=G= %s%s: [FAILED]%s%s" % + (self.RED, gherkin_step, self.NORMAL, e)) + raise + return _wrapper \ No newline at end of file diff --git a/test/integration/plugins/nuagevsp/test_nuage_configdrive.py b/test/integration/plugins/nuagevsp/test_nuage_configdrive.py index 53a22bcb1a7..4fd531dcd6d 100644 --- a/test/integration/plugins/nuagevsp/test_nuage_configdrive.py +++ b/test/integration/plugins/nuagevsp/test_nuage_configdrive.py @@ -242,6 +242,34 @@ class TestNuageConfigDrive(nuageTestCase, ConfigDriveUtils): # --- Gherkin style helper methods --- # ========================================================================= + def given_config_drive_provider_is(self, state): + return self.update_provider_state(state) + + def given_a_network_offering_with_configdrive(self): + self.offering = self.create_NetworkOffering(self._get_test_data( + "isolated_configdrive_network_offering_withoutdns")) + + def then_creating_a_network_with_that_offering_fails(self): + create_network = self.verify_network_creation( + offering=self.offering, + gateway='10.6.6.6') + self.assertFalse(create_network.success, + 'Network found success = %s, expected success =%s' + % (str(create_network.success), 'False')) + + def when_I_create_a_network_with_that_offering(self): + return self.verify_network_creation( + offering=self.offering, + gateway='10.1.1.1') + + def then_the_network_is_successfully_created(self, network): + self.assertTrue(network.success, + 'Network found success = %s, expected success = %s' + % (str(network.success), 'True')) + + def then_the_network_is_has(self, network, state): + self.validate_Network(network, state=state) + # ========================================================================= # --- TEST CASES --- # ========================================================================= @@ -290,34 +318,24 @@ class TestNuageConfigDrive(nuageTestCase, ConfigDriveUtils): self.debug("+++Testing configdrive in an Isolated network fails..." "as provider configdrive is still disabled...") - self.update_provider_state("Disabled") - create_network = self.verify_network_creation( - offering_name="isolated_configdrive_network_offering_" - "withoutdns", - gateway='10.1.1.1') - self.assertFalse(create_network.success, - 'Network found success = %s, expected success =%s' - % (str(create_network.success), 'False')) - + self.given_config_drive_provider_is("Disabled") + self.given_a_network_offering_with_configdrive() + self.then_creating_a_network_with_that_offering_fails() self.debug("+++Test user data & password reset functionality " "using configdrive in an Isolated network without VR") - self.update_provider_state("Enabled") - create_network1 = self.verify_network_creation( - offering=create_network.offering, - gateway='10.1.1.1') - self.assertTrue(create_network1.success, - 'Network found success = %s, expected success = %s' - % (str(create_network1.success), 'True')) - self.validate_Network(create_network1.network, state="Allocated") - create_network2 = self.verify_network_creation( - offering=create_network.offering, - gateway='10.1.2.1') - self.assertTrue(create_network2.success, - 'Network found success = %s,expected success = %s' - % (str(create_network2.success), 'True')) - self.validate_Network(create_network2.network, state="Allocated") + + self.given_config_drive_provider_is("Enabled") + create_network1 = self.when_I_create_a_network_with_that_offering() + self.then_the_network_is_successfully_created(create_network1) + self.then_the_network_is_has(create_network1, state="Allocated") + + create_network2 = self.when_I_create_a_network_with_that_offering() + self.then_the_network_is_successfully_created(create_network2) + self.then_the_network_is_has(create_network2, state="Allocated") + + self.update_password_enable_in_template(True) self.debug("+++Deploy VM in the created Isolated network " @@ -331,8 +349,9 @@ class TestNuageConfigDrive(nuageTestCase, ConfigDriveUtils): with self.assertRaises(Exception): self.get_Router(create_network1) self.debug("+++Verified no VR is spawned for this network ") + # We need to have the vm password - vm1.password = vm1.resetPassword(self.api_client) + self.reset_password(vm1) self.debug("Password reset to - %s" % vm1.password) self.debug("VM - %s password - %s !" % (vm1.name, vm1.password)) @@ -362,10 +381,7 @@ class TestNuageConfigDrive(nuageTestCase, ConfigDriveUtils): userdata=expected_user_data1, ssh_key=self.keypair) # After sshkey reset we need to have the vm password again - vm1.password = vm1.resetPassword(self.api_client) - self.debug("Password reset to - %s" % vm1.password) - self.debug("VM - %s password - %s !" % - (vm1.name, vm1.password)) + self.reset_password(vm1) self.debug("Adding a non-default nic to the VM " "making it a multi-nic VM...") @@ -376,10 +392,7 @@ class TestNuageConfigDrive(nuageTestCase, ConfigDriveUtils): metadata=True, userdata=expected_user_data1, ssh_key=self.keypair) - vm1.password = vm1.resetPassword(self.api_client) - self.debug("Password reset to - %s" % vm1.password) - self.debug("VM - %s password - %s !" % - (vm1.name, vm1.password)) + self.reset_password(vm1) expected_user_data1 = self.update_userdata(vm1, "hellomultinicvm1") @@ -403,10 +416,7 @@ class TestNuageConfigDrive(nuageTestCase, ConfigDriveUtils): self.PasswordTest(False), metadata=True, userdata=expected_user_data1) - vm1.password = vm1.resetPassword(self.api_client) - self.debug("Password reset to - %s" % vm1.password) - self.debug("VM - %s password - %s !" % - (vm1.name, vm1.password)) + self.reset_password(vm1) self.verify_config_drive_content(vm1, public_ip_2, self.PasswordTest(vm1.password), userdata=expected_user_data1) @@ -457,10 +467,7 @@ class TestNuageConfigDrive(nuageTestCase, ConfigDriveUtils): create_network2.network, operation="remove") create_network2.network.delete(self.api_client) - vm1.password = vm1.resetPassword(self.api_client) - self.debug("Password reset to - %s" % vm1.password) - self.debug("VM - %s password - %s !" % - (vm1.name, vm1.password)) + self.reset_password(vm1) self.debug("+++ Restarting the created Isolated network without " "VR without cleanup...") @@ -517,10 +524,7 @@ class TestNuageConfigDrive(nuageTestCase, ConfigDriveUtils): self.debug("+++Verified VR is spawned for this network ") # We need to have the vm password - vm2.password = vm2.resetPassword(self.api_client) - self.debug("Password reset to - %s" % vm2.password) - self.debug("VM2 - %s password - %s !" % - (vm2.name, vm2.password)) + self.reset_password(vm2) public_ip_3 = self.acquire_PublicIPAddress( create_vrnetwork1.network) self.create_and_verify_fip_and_fw(vm2, public_ip_3, @@ -632,7 +636,6 @@ class TestNuageConfigDrive(nuageTestCase, ConfigDriveUtils): self.verify_config_drive_content(vm1, public_ip_1, self.PasswordTest(False), userdata=expected_user_data1) - self.debug("Resetting password for VM - %s" % vm1.name) self.reset_password(vm1) self.debug("SSHing into the VM for verifying its new password " "after its password reset...") @@ -966,7 +969,7 @@ class TestNuageConfigDrive(nuageTestCase, ConfigDriveUtils): self.verify_vsd_router(vr2) self.debug("+++Verified VR is spawned for this network ") # We need to have the vm password - vm2.password = vm2.resetPassword(self.api_client) + self.reset_password(vm2) self.debug("Password reset to - %s" % vm2.password) self.debug("VM2 - %s password - %s !" % (vm2.name, vm2.password)) @@ -1431,7 +1434,7 @@ class TestNuageConfigDrive(nuageTestCase, ConfigDriveUtils): self.get_Router(shared_network) self.debug("+++ Verified no VR is spawned for this network ") # We need to have the vm password - vm1.password = vm1.resetPassword(self.api_client) + self.reset_password(vm1) self.debug("Password reset to - %s" % vm1.password) self.debug("VM - %s password - %s !" % (vm1.name, vm1.password)) @@ -1456,7 +1459,7 @@ class TestNuageConfigDrive(nuageTestCase, ConfigDriveUtils): metadata=True, userdata=expected_user_data, ssh_key=self.keypair) - vm1.password = vm1.resetPassword(self.api_client) + self.reset_password(vm1) self.debug("Password reset to - %s" % vm1.password) self.debug("VM - %s password - %s !" % (vm1.name, vm1.password)) @@ -1482,7 +1485,7 @@ class TestNuageConfigDrive(nuageTestCase, ConfigDriveUtils): self.PasswordTest(False), metadata=True, userdata=expected_user_data1) - vm1.password = vm1.resetPassword(self.api_client) + self.reset_password(vm1) self.debug("Password reset to - %s" % vm1.password) self.debug("VM - %s password - %s !" % (vm1.name, vm1.password)) @@ -1534,7 +1537,7 @@ class TestNuageConfigDrive(nuageTestCase, ConfigDriveUtils): shared_network2.network.delete(self.api_client) # We need to have the vm password - vm1.password = vm1.resetPassword(self.api_client) + self.reset_password(vm1) self.debug("Password reset to - %s" % vm1.password) self.debug("VM - %s password - %s !" % (vm1.name, vm1.password)) @@ -1687,7 +1690,7 @@ class TestNuageConfigDrive(nuageTestCase, ConfigDriveUtils): self.get_Router(create_network) self.debug("+++Verified no VR is spawned for this network ") # We need to have the vm password - vm1.password = vm1.resetPassword(self.api_client) + self.reset_password(vm1) self.debug("Password reset to - %s" % vm1.password) self.debug("VM - %s password - %s !" % (vm1.name, vm1.password)) diff --git a/test/integration/plugins/nuagevsp/test_nuage_extra_dhcp.py b/test/integration/plugins/nuagevsp/test_nuage_extra_dhcp.py index e167ddef122..4b36b5100a9 100644 --- a/test/integration/plugins/nuagevsp/test_nuage_extra_dhcp.py +++ b/test/integration/plugins/nuagevsp/test_nuage_extra_dhcp.py @@ -19,7 +19,8 @@ Nuage VSP SDN plugin """ # Import Local Modules -from nuageTestCase import (nuageTestCase, gherkin) +from nuageTestCase import (nuageTestCase) +from plugins.nuagevsp.nuage_lib import gherkin from marvin.cloudstackAPI import updateVirtualMachine, updateZone from marvin.lib.base import (Account, Network,