From 4eb88fc6862cfe939dadbb2dacadfba3223aea76 Mon Sep 17 00:00:00 2001 From: Deepak Garg Date: Fri, 17 Aug 2012 15:44:21 +0530 Subject: [PATCH 01/28] CS-16052. Adding indices to the create-schema and upgrade schema in the autoscale tables. reviewed by. Vijay V. --- setup/db/create-schema.sql | 22 +++++++++++++++------- setup/db/db/schema-304to305.sql | 23 ++++++++++++++++------- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index 1321a232b84..aa90430a42f 100755 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -2348,7 +2348,9 @@ CREATE TABLE `cloud`.`counter` ( `removed` datetime COMMENT 'date removed if not null', `created` datetime NOT NULL COMMENT 'date created', PRIMARY KEY (`id`), - CONSTRAINT `uc_counter__uuid` UNIQUE (`uuid`) + CONSTRAINT `uc_counter__uuid` UNIQUE (`uuid`), + INDEX `i_counter__removed`(`removed`), + INDEX `i_counter__source`(`source`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `cloud`.`conditions` ( @@ -2365,7 +2367,8 @@ CREATE TABLE `cloud`.`conditions` ( CONSTRAINT `fk_conditions__counter_id` FOREIGN KEY `fk_condition__counter_id`(`counter_id`) REFERENCES `counter`(`id`), CONSTRAINT `fk_conditions__account_id` FOREIGN KEY `fk_condition__account_id` (`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, CONSTRAINT `fk_conditions__domain_id` FOREIGN KEY `fk_condition__domain_id` (`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, - CONSTRAINT `uc_conditions__uuid` UNIQUE (`uuid`) + CONSTRAINT `uc_conditions__uuid` UNIQUE (`uuid`), + INDEX `i_conditions__removed`(`removed`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `cloud`.`autoscale_vmprofiles` ( @@ -2387,7 +2390,8 @@ CREATE TABLE `cloud`.`autoscale_vmprofiles` ( CONSTRAINT `fk_autoscale_vmprofiles__domain_id` FOREIGN KEY `fk_autoscale_vmprofiles__domain_id` (`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, CONSTRAINT `fk_autoscale_vmprofiles__account_id` FOREIGN KEY `fk_autoscale_vmprofiles__account_id` (`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, CONSTRAINT `fk_autoscale_vmprofiles__autoscale_user_id` FOREIGN KEY `fk_autoscale_vmprofiles__autoscale_user_id` (`autoscale_user_id`) REFERENCES `user`(`id`) ON DELETE CASCADE, - CONSTRAINT `uc_autoscale_vmprofiles__uuid` UNIQUE (`uuid`) + CONSTRAINT `uc_autoscale_vmprofiles__uuid` UNIQUE (`uuid`), + INDEX `i_autoscale_vmprofiles__removed`(`removed`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `cloud`.`autoscale_policies` ( @@ -2403,7 +2407,8 @@ CREATE TABLE `cloud`.`autoscale_policies` ( PRIMARY KEY (`id`), CONSTRAINT `fk_autoscale_policies__domain_id` FOREIGN KEY `fk_autoscale_policies__domain_id` (`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, CONSTRAINT `fk_autoscale_policies__account_id` FOREIGN KEY `fk_autoscale_policies__account_id` (`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, - CONSTRAINT `uc_autoscale_policies__uuid` UNIQUE (`uuid`) + CONSTRAINT `uc_autoscale_policies__uuid` UNIQUE (`uuid`), + INDEX `i_autoscale_policies__removed`(`removed`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `cloud`.`autoscale_vmgroups` ( @@ -2427,7 +2432,8 @@ CREATE TABLE `cloud`.`autoscale_vmgroups` ( CONSTRAINT `fk_autoscale_vmgroups__domain_id` FOREIGN KEY `fk_autoscale_vmgroups__domain_id` (`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, CONSTRAINT `fk_autoscale_vmgroups__account_id` FOREIGN KEY `fk_autoscale_vmgroups__account_id` (`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, CONSTRAINT `fk_autoscale_vmgroups__zone_id` FOREIGN KEY `fk_autoscale_vmgroups__zone_id`(`zone_id`) REFERENCES `data_center`(`id`), - CONSTRAINT `uc_autoscale_vmgroups__uuid` UNIQUE (`uuid`) + CONSTRAINT `uc_autoscale_vmgroups__uuid` UNIQUE (`uuid`), + INDEX `i_autoscale_vmgroups__removed`(`removed`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `cloud`.`autoscale_policy_condition_map` ( @@ -2436,7 +2442,8 @@ CREATE TABLE `cloud`.`autoscale_policy_condition_map` ( `condition_id` bigint unsigned NOT NULL, PRIMARY KEY (`id`), CONSTRAINT `fk_autoscale_policy_condition_map__policy_id` FOREIGN KEY `fk_autoscale_policy_condition_map__policy_id` (`policy_id`) REFERENCES `autoscale_policies` (`id`) ON DELETE CASCADE, - CONSTRAINT `fk_autoscale_policy_condition_map__condition_id` FOREIGN KEY `fk_autoscale_policy_condition_map__condition_id` (`condition_id`) REFERENCES `conditions` (`id`) + CONSTRAINT `fk_autoscale_policy_condition_map__condition_id` FOREIGN KEY `fk_autoscale_policy_condition_map__condition_id` (`condition_id`) REFERENCES `conditions` (`id`), + INDEX `i_autoscale_policy_condition_map__policy_id`(`policy_id`), ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `cloud`.`autoscale_vmgroup_policy_map` ( @@ -2445,7 +2452,8 @@ CREATE TABLE `cloud`.`autoscale_vmgroup_policy_map` ( `policy_id` bigint unsigned NOT NULL, PRIMARY KEY (`id`), CONSTRAINT `fk_autoscale_vmgroup_policy_map__vmgroup_id` FOREIGN KEY `fk_autoscale_vmgroup_policy_map__vmgroup_id` (`vmgroup_id`) REFERENCES `autoscale_vmgroups` (`id`) ON DELETE CASCADE, - CONSTRAINT `fk_autoscale_vmgroup_policy_map__policy_id` FOREIGN KEY `fk_autoscale_vmgroup_policy_map__policy_id` (`policy_id`) REFERENCES `autoscale_policies` (`id`) + CONSTRAINT `fk_autoscale_vmgroup_policy_map__policy_id` FOREIGN KEY `fk_autoscale_vmgroup_policy_map__policy_id` (`policy_id`) REFERENCES `autoscale_policies` (`id`), + INDEX `i_autoscale_vmgroup_policy_map__vmgroup_id`(`vmgroup_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `cloud`.`counter` (id, source, name, value,created) VALUES (1,'snmp','Linux User CPU - Percentage', '1.3.6.1.4.1.2021.11.9.0', now()); diff --git a/setup/db/db/schema-304to305.sql b/setup/db/db/schema-304to305.sql index a2e726ef3f1..44d947386ef 100755 --- a/setup/db/db/schema-304to305.sql +++ b/setup/db/db/schema-304to305.sql @@ -182,7 +182,9 @@ CREATE TABLE `cloud`.`counter` ( `removed` datetime COMMENT 'date removed if not null', `created` datetime NOT NULL COMMENT 'date created', PRIMARY KEY (`id`), - CONSTRAINT `uc_counter__uuid` UNIQUE (`uuid`) + CONSTRAINT `uc_counter__uuid` UNIQUE (`uuid`), + INDEX `i_counter__removed`(`removed`), + INDEX `i_counter__source`(`source`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `cloud`.`conditions` ( @@ -199,7 +201,8 @@ CREATE TABLE `cloud`.`conditions` ( CONSTRAINT `fk_conditions__counter_id` FOREIGN KEY `fk_condition__counter_id`(`counter_id`) REFERENCES `counter`(`id`), CONSTRAINT `fk_conditions__account_id` FOREIGN KEY `fk_condition__account_id` (`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, CONSTRAINT `fk_conditions__domain_id` FOREIGN KEY `fk_condition__domain_id` (`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, - CONSTRAINT `uc_conditions__uuid` UNIQUE (`uuid`) + CONSTRAINT `uc_conditions__uuid` UNIQUE (`uuid`), + INDEX `i_conditions__removed`(`removed`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `cloud`.`autoscale_vmprofiles` ( @@ -221,7 +224,8 @@ CREATE TABLE `cloud`.`autoscale_vmprofiles` ( CONSTRAINT `fk_autoscale_vmprofiles__domain_id` FOREIGN KEY `fk_autoscale_vmprofiles__domain_id` (`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, CONSTRAINT `fk_autoscale_vmprofiles__account_id` FOREIGN KEY `fk_autoscale_vmprofiles__account_id` (`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, CONSTRAINT `fk_autoscale_vmprofiles__autoscale_user_id` FOREIGN KEY `fk_autoscale_vmprofiles__autoscale_user_id` (`autoscale_user_id`) REFERENCES `user`(`id`) ON DELETE CASCADE, - CONSTRAINT `uc_autoscale_vmprofiles__uuid` UNIQUE (`uuid`) + CONSTRAINT `uc_autoscale_vmprofiles__uuid` UNIQUE (`uuid`), + INDEX `i_autoscale_vmprofiles__removed`(`removed`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `cloud`.`autoscale_policies` ( @@ -237,7 +241,8 @@ CREATE TABLE `cloud`.`autoscale_policies` ( PRIMARY KEY (`id`), CONSTRAINT `fk_autoscale_policies__domain_id` FOREIGN KEY `fk_autoscale_policies__domain_id` (`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, CONSTRAINT `fk_autoscale_policies__account_id` FOREIGN KEY `fk_autoscale_policies__account_id` (`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, - CONSTRAINT `uc_autoscale_policies__uuid` UNIQUE (`uuid`) + CONSTRAINT `uc_autoscale_policies__uuid` UNIQUE (`uuid`), + INDEX `i_autoscale_policies__removed`(`removed`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `cloud`.`autoscale_vmgroups` ( @@ -261,7 +266,9 @@ CREATE TABLE `cloud`.`autoscale_vmgroups` ( CONSTRAINT `fk_autoscale_vmgroups__domain_id` FOREIGN KEY `fk_autoscale_vmgroups__domain_id` (`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, CONSTRAINT `fk_autoscale_vmgroups__account_id` FOREIGN KEY `fk_autoscale_vmgroups__account_id` (`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, CONSTRAINT `fk_autoscale_vmgroups__zone_id` FOREIGN KEY `fk_autoscale_vmgroups__zone_id`(`zone_id`) REFERENCES `data_center`(`id`), - CONSTRAINT `uc_autoscale_vmgroups__uuid` UNIQUE (`uuid`) + CONSTRAINT `uc_autoscale_vmgroups__uuid` UNIQUE (`uuid`), + INDEX `i_autoscale_vmgroups__removed`(`removed`), + INDEX `i_autoscale_vmgroups__load_balancer_id`(`load_balancer_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `cloud`.`autoscale_policy_condition_map` ( @@ -270,7 +277,8 @@ CREATE TABLE `cloud`.`autoscale_policy_condition_map` ( `condition_id` bigint unsigned NOT NULL, PRIMARY KEY (`id`), CONSTRAINT `fk_autoscale_policy_condition_map__policy_id` FOREIGN KEY `fk_autoscale_policy_condition_map__policy_id` (`policy_id`) REFERENCES `autoscale_policies` (`id`) ON DELETE CASCADE, - CONSTRAINT `fk_autoscale_policy_condition_map__condition_id` FOREIGN KEY `fk_autoscale_policy_condition_map__condition_id` (`condition_id`) REFERENCES `conditions` (`id`) + CONSTRAINT `fk_autoscale_policy_condition_map__condition_id` FOREIGN KEY `fk_autoscale_policy_condition_map__condition_id` (`condition_id`) REFERENCES `conditions` (`id`), + INDEX `i_autoscale_policy_condition_map__policy_id`(`policy_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `cloud`.`autoscale_vmgroup_policy_map` ( @@ -279,7 +287,8 @@ CREATE TABLE `cloud`.`autoscale_vmgroup_policy_map` ( `policy_id` bigint unsigned NOT NULL, PRIMARY KEY (`id`), CONSTRAINT `fk_autoscale_vmgroup_policy_map__vmgroup_id` FOREIGN KEY `fk_autoscale_vmgroup_policy_map__vmgroup_id` (`vmgroup_id`) REFERENCES `autoscale_vmgroups` (`id`) ON DELETE CASCADE, - CONSTRAINT `fk_autoscale_vmgroup_policy_map__policy_id` FOREIGN KEY `fk_autoscale_vmgroup_policy_map__policy_id` (`policy_id`) REFERENCES `autoscale_policies` (`id`) + CONSTRAINT `fk_autoscale_vmgroup_policy_map__policy_id` FOREIGN KEY `fk_autoscale_vmgroup_policy_map__policy_id` (`policy_id`) REFERENCES `autoscale_policies` (`id`), + INDEX `i_autoscale_vmgroup_policy_map__vmgroup_id`(`vmgroup_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `cloud`.`counter` (id, source, name, value,created) VALUES (1,'snmp','Linux User CPU - Percentage', '1.3.6.1.4.1.2021.11.9.0', now()); From f2aeb9351faa97fa7d5ce5ae63aca09b91fa793e Mon Sep 17 00:00:00 2001 From: Vijay Date: Fri, 17 Aug 2012 16:57:15 +0530 Subject: [PATCH 02/28] CS-15927 : Able to add autoscale VMs to static LB rule First Part: AutoScale Vms are named as "AutoScale-LB-" This could be used by UI and have filter mechanism to not display autoscale vms during the "Add Vms" dialog for a non autoscaled lb rule. --- api/src/com/cloud/agent/api/to/LoadBalancerTO.java | 14 ++++++++++---- .../com/cloud/network/lb/LoadBalancingRule.java | 8 +++++++- .../cloud/network/resource/NetscalerResource.java | 1 + .../network/lb/LoadBalancingRulesManagerImpl.java | 11 +++++++---- 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/api/src/com/cloud/agent/api/to/LoadBalancerTO.java b/api/src/com/cloud/agent/api/to/LoadBalancerTO.java index 64c85c035a3..362b85ac6a0 100644 --- a/api/src/com/cloud/agent/api/to/LoadBalancerTO.java +++ b/api/src/com/cloud/agent/api/to/LoadBalancerTO.java @@ -287,10 +287,11 @@ public class LoadBalancerTO implements Serializable { private final String cloudStackApiUrl; private final String autoScaleUserApiKey; private final String autoScaleUserSecretKey; + private final String vmName; private final String networkId; public AutoScaleVmProfileTO(String zoneId, String domainId, String cloudStackApiUrl, String autoScaleUserApiKey, String autoScaleUserSecretKey, String serviceOfferingId, - String templateId, String networkId, String otherDeployParams, String snmpCommunity, Integer snmpPort, Integer destroyVmGraceperiod) { + String templateId, String vmName, String networkId, String otherDeployParams, String snmpCommunity, Integer snmpPort, Integer destroyVmGraceperiod) { this.zoneId = zoneId; this.domainId = domainId; this.serviceOfferingId = serviceOfferingId; @@ -302,6 +303,7 @@ public class LoadBalancerTO implements Serializable { this.cloudStackApiUrl = cloudStackApiUrl; this.autoScaleUserApiKey = autoScaleUserApiKey; this.autoScaleUserSecretKey = autoScaleUserSecretKey; + this.vmName = vmName; this.networkId = networkId; } @@ -349,6 +351,10 @@ public class LoadBalancerTO implements Serializable { return autoScaleUserSecretKey; } + public String getVmName() { + return vmName; + } + public String getNetworkId() { return networkId; } @@ -433,9 +439,9 @@ public class LoadBalancerTO implements Serializable { AutoScaleVmProfileTO autoScaleVmProfileTO = new AutoScaleVmProfileTO(lbAutoScaleVmProfile.getZoneId(), lbAutoScaleVmProfile.getDomainId(), lbAutoScaleVmProfile.getCsUrl(), lbAutoScaleVmProfile.getAutoScaleUserApiKey(), lbAutoScaleVmProfile.getAutoScaleUserSecretKey(), - lbAutoScaleVmProfile.getServiceOfferingId(), lbAutoScaleVmProfile.getTemplateId(), lbAutoScaleVmProfile.getNetworkId(), - autoScaleVmProfile.getOtherDeployParams(), autoScaleVmProfile.getSnmpCommunity(), autoScaleVmProfile.getSnmpPort(), - autoScaleVmProfile.getDestroyVmGraceperiod()); + lbAutoScaleVmProfile.getServiceOfferingId(), lbAutoScaleVmProfile.getTemplateId(), lbAutoScaleVmProfile.getVmName(), + lbAutoScaleVmProfile.getNetworkId(),autoScaleVmProfile.getOtherDeployParams(), autoScaleVmProfile.getSnmpCommunity(), + autoScaleVmProfile.getSnmpPort(), autoScaleVmProfile.getDestroyVmGraceperiod()); AutoScaleVmGroup autoScaleVmGroup = lbAutoScaleVmGroup.getVmGroup(); autoScaleVmGroupTO = new AutoScaleVmGroupTO(autoScaleVmGroup.getMinMembers(), autoScaleVmGroup.getMaxMembers(), autoScaleVmGroup.getMemberPort(), diff --git a/api/src/com/cloud/network/lb/LoadBalancingRule.java b/api/src/com/cloud/network/lb/LoadBalancingRule.java index 9d9caec097b..35affc9735d 100644 --- a/api/src/com/cloud/network/lb/LoadBalancingRule.java +++ b/api/src/com/cloud/network/lb/LoadBalancingRule.java @@ -308,8 +308,9 @@ public class LoadBalancingRule implements FirewallRule, LoadBalancer { private final String serviceOfferingId; private final String templateId; private final String networkId; + private final String vmName; - public LbAutoScaleVmProfile(AutoScaleVmProfile profile, String autoScaleUserApiKey, String autoScaleUserSecretKey, String csUrl, String zoneId, String domainId, String serviceOfferingId, String templateId, String networkId) { + public LbAutoScaleVmProfile(AutoScaleVmProfile profile, String autoScaleUserApiKey, String autoScaleUserSecretKey, String csUrl, String zoneId, String domainId, String serviceOfferingId, String templateId, String vmName, String networkId) { this.profile = profile; this.autoScaleUserApiKey = autoScaleUserApiKey; this.autoScaleUserSecretKey = autoScaleUserSecretKey; @@ -318,6 +319,7 @@ public class LoadBalancingRule implements FirewallRule, LoadBalancer { this.domainId = domainId; this.serviceOfferingId = serviceOfferingId; this.templateId = templateId; + this.vmName = vmName; this.networkId = networkId; } @@ -353,6 +355,10 @@ public class LoadBalancingRule implements FirewallRule, LoadBalancer { return templateId; } + public String getVmName() { + return vmName; + } + public String getNetworkId() { return networkId; } diff --git a/core/src/com/cloud/network/resource/NetscalerResource.java b/core/src/com/cloud/network/resource/NetscalerResource.java index ee8555475c5..64980dc79cf 100644 --- a/core/src/com/cloud/network/resource/NetscalerResource.java +++ b/core/src/com/cloud/network/resource/NetscalerResource.java @@ -1717,6 +1717,7 @@ public class NetscalerResource implements ServerResource { ApiConstants.ZONE_ID + "=" + profileTO.getZoneId()+ "&" + ApiConstants.SERVICE_OFFERING_ID + "=" + profileTO.getServiceOfferingId()+ "&" + ApiConstants.TEMPLATE_ID + "=" + profileTO.getTemplateId()+ "&" + + ApiConstants.DISPLAY_NAME + "=" + profileTO.getVmName()+ "&" + ((profileTO.getNetworkId() == null)? "" : (ApiConstants.NETWORK_IDS + "=" + profileTO.getNetworkId()+ "&")) + ((profileTO.getOtherDeployParams() == null)? "" : (profileTO.getOtherDeployParams() + "&")) + "lbruleid=" + loadBalancerTO.getUuid(); diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java index e2fce3d2d81..bda4a92741b 100755 --- a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java +++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java @@ -250,7 +250,9 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesMa return null; } - private LbAutoScaleVmGroup getLbAutoScaleVmGroup(AutoScaleVmGroupVO vmGroup, String currentState, long networkId) { + private LbAutoScaleVmGroup getLbAutoScaleVmGroup(AutoScaleVmGroupVO vmGroup, String currentState, LoadBalancerVO lb) { + long lbNetworkId = lb.getNetworkId(); + String lbName = lb.getName(); List vmGroupPolicyMapList = _autoScaleVmGroupPolicyMapDao.listByVmGroupId(vmGroup.getId()); List autoScalePolicies = new ArrayList(); for (AutoScaleVmGroupPolicyMapVO vmGroupPolicyMap : vmGroupPolicyMapList) { @@ -274,6 +276,7 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesMa String domainId = _domainDao.findById(autoScaleVmProfile.getDomainId()).getUuid(); String serviceOfferingId = _offeringsDao.findById(autoScaleVmProfile.getServiceOfferingId()).getUuid(); String templateId = _templateDao.findById(autoScaleVmProfile.getTemplateId()).getUuid(); + String vmName = "AutoScale-LB-" + lbName; String lbNetworkUuid = null; DataCenter zone = _configMgr.getZone(vmGroup.getZoneId()); @@ -281,7 +284,7 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesMa throw new InvalidParameterValueException("Unable to find zone by id", null); } else { if (zone.getNetworkType() == NetworkType.Advanced) { - NetworkVO lbNetwork = _networkDao.findById(networkId); + NetworkVO lbNetwork = _networkDao.findById(lbNetworkId); lbNetworkUuid = lbNetwork.getUuid(); } } @@ -300,12 +303,12 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesMa } - LbAutoScaleVmProfile lbAutoScaleVmProfile = new LbAutoScaleVmProfile(autoScaleVmProfile, apiKey, secretKey, csUrl, zoneId, domainId, serviceOfferingId, templateId, lbNetworkUuid); + LbAutoScaleVmProfile lbAutoScaleVmProfile = new LbAutoScaleVmProfile(autoScaleVmProfile, apiKey, secretKey, csUrl, zoneId, domainId, serviceOfferingId, templateId, vmName, lbNetworkUuid); return new LbAutoScaleVmGroup(vmGroup, autoScalePolicies, lbAutoScaleVmProfile, currentState); } private boolean applyAutoScaleConfig(LoadBalancerVO lb, AutoScaleVmGroupVO vmGroup, String currentState) throws ResourceUnavailableException { - LbAutoScaleVmGroup lbAutoScaleVmGroup = getLbAutoScaleVmGroup(vmGroup, currentState, lb.getNetworkId()); + LbAutoScaleVmGroup lbAutoScaleVmGroup = getLbAutoScaleVmGroup(vmGroup, currentState, lb); /* Regular config like destinations need not be packed for applying autoscale config as of today.*/ LoadBalancingRule rule = new LoadBalancingRule(lb, null, null); rule.setAutoScaleVmGroup(lbAutoScaleVmGroup); From dbffdef3082f1d1d3726a498b12c5b0ebbedbdcb Mon Sep 17 00:00:00 2001 From: kishan Date: Fri, 17 Aug 2012 17:30:20 +0530 Subject: [PATCH 03/28] bug CS-16035: Added traffic sentinel config params to 305 upgrade status CS-16035: resolved fixed --- setup/db/db/schema-304to305.sql | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/setup/db/db/schema-304to305.sql b/setup/db/db/schema-304to305.sql index 44d947386ef..399114de1d3 100755 --- a/setup/db/db/schema-304to305.sql +++ b/setup/db/db/schema-304to305.sql @@ -374,6 +374,8 @@ UPDATE `cloud`.`configuration` SET component='StorageManager' WHERE name='storag UPDATE `cloud`.`configuration` SET description='Comma separated list of cidrs internal to the datacenter that can host template download servers, please note 0.0.0.0 is not a valid site ' WHERE name='secstorage.allowed.internal.sites'; INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Network', 'DEFAULT', 'management-server', 'site2site.vpn.vpngateway.connection.limit', '4', 'The maximum number of VPN connection per VPN gateway'); -INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Network', 'DEFAULT', 'management-server', 'site2site.vpn.customergateway.subnets.limit', '10', 'The maximum number of subnets per customer gateway'); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Network', 'DEFAULT', 'management-server', 'site2site.vpn.customergateway.subnets.limit', '10', 'The maximum number of subnets per customer gateway'); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Usage', 'DEFAULT', 'management-server', 'traffic.sentinel.include.zones', 'EXTERNAL', 'Traffic going into specified list of zones is metered. For metering all traffic leave this parameter empty'); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Usage', 'DEFAULT', 'management-server', 'traffic.sentinel.exclude.zones', '', 'Traffic going into specified list of zones is not metered'); DROP TABLE IF EXISTS `cloud`.`ovs_tunnel_account`; From ad6ac9b4498cc47c5f111fc0627a7ccfcd3dfe78 Mon Sep 17 00:00:00 2001 From: Deepak Garg Date: Fri, 17 Aug 2012 14:34:21 +0530 Subject: [PATCH 04/28] CS-15617. Changed CounterResponse to a List as queryAsyncJob expects it. reviewed by: Nitin --- api/src/com/cloud/api/response/ConditionResponse.java | 8 +++++--- server/src/com/cloud/api/ApiResponseHelper.java | 8 ++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/api/src/com/cloud/api/response/ConditionResponse.java b/api/src/com/cloud/api/response/ConditionResponse.java index d2922d6c648..636c9275e62 100644 --- a/api/src/com/cloud/api/response/ConditionResponse.java +++ b/api/src/com/cloud/api/response/ConditionResponse.java @@ -17,6 +17,8 @@ package com.cloud.api.response; +import java.util.List; + import com.cloud.api.ApiConstants; import com.cloud.serializer.Param; import com.cloud.utils.IdentityProxy; @@ -38,7 +40,7 @@ public class ConditionResponse extends BaseResponse implements ControlledEntityR @SerializedName("counter") @Param(description = "Details of the Counter.") - private CounterResponse counter; + private List counterResponse; @SerializedName(ApiConstants.DOMAIN_ID) @Param(description = "the domain id of the Condition owner") @@ -80,8 +82,8 @@ public class ConditionResponse extends BaseResponse implements ControlledEntityR this.relationalOperator = relationalOperator; } - public void setCounter(CounterResponse counter) { - this.counter = counter; + public void setCounterResponse(List counterResponse) { + this.counterResponse = counterResponse; } @Override diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index 11b8c859686..a6a3ccc6e52 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -4020,13 +4020,13 @@ public class ApiResponseHelper implements ResponseGenerator { public ConditionResponse createConditionResponse(Condition condition) { ConditionResponse response = new ConditionResponse(); response.setId(condition.getId()); - CounterResponse counter; - counter = createCounterResponse(ApiDBUtils.getCounter(condition.getCounterid())); - response.setCounter(counter); + List counterResponseList = new ArrayList(); + counterResponseList.add(createCounterResponse(ApiDBUtils.getCounter(condition.getCounterid()))); + response.setCounterResponse(counterResponseList); response.setRelationalOperator(condition.getRelationalOperator().toString()); response.setThreshold(condition.getThreshold()); response.setObjectName("condition"); populateOwner(response, condition); return response; } -} +} From 652bc1bd6d63a5d26695cc65ba0f18c6ebbb2efa Mon Sep 17 00:00:00 2001 From: Koushik Das Date: Fri, 17 Aug 2012 18:43:15 +0530 Subject: [PATCH 05/28] CS-16039 : Enabling/Disabling of Zone results in localstorageenabled flag to be reset to false. Updated get method to retuen null if no value specified for localstorageenabled in UpdateZone command. Reviewed-by: Abhi --- api/src/com/cloud/api/commands/UpdateZoneCmd.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/api/src/com/cloud/api/commands/UpdateZoneCmd.java b/api/src/com/cloud/api/commands/UpdateZoneCmd.java index 0f4b6936ed2..2d57467657b 100755 --- a/api/src/com/cloud/api/commands/UpdateZoneCmd.java +++ b/api/src/com/cloud/api/commands/UpdateZoneCmd.java @@ -139,9 +139,6 @@ public class UpdateZoneCmd extends BaseCmd { } public Boolean getLocalStorageEnabled() { - if (localStorageEnabled == null) { - return false; - } return localStorageEnabled; } From 3249d7d36f02739e9f92e58d714250a0638830be Mon Sep 17 00:00:00 2001 From: Vijay Date: Fri, 17 Aug 2012 18:41:02 +0530 Subject: [PATCH 06/28] Fixing error in commit 4eb88fc6862cfe939dadbb2dacadfba3223aea76. Changes in 4eb88fc6862cfe939dadbb2dacadfba3223aea76 are not complete the upgrade-schema schema-304to305.sql and create-schema.sql is not consistent, will be fixed in a subsequent checkin. --- setup/db/create-schema.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index aa90430a42f..933844a2beb 100755 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -2443,7 +2443,7 @@ CREATE TABLE `cloud`.`autoscale_policy_condition_map` ( PRIMARY KEY (`id`), CONSTRAINT `fk_autoscale_policy_condition_map__policy_id` FOREIGN KEY `fk_autoscale_policy_condition_map__policy_id` (`policy_id`) REFERENCES `autoscale_policies` (`id`) ON DELETE CASCADE, CONSTRAINT `fk_autoscale_policy_condition_map__condition_id` FOREIGN KEY `fk_autoscale_policy_condition_map__condition_id` (`condition_id`) REFERENCES `conditions` (`id`), - INDEX `i_autoscale_policy_condition_map__policy_id`(`policy_id`), + INDEX `i_autoscale_policy_condition_map__policy_id`(`policy_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `cloud`.`autoscale_vmgroup_policy_map` ( From 623f3b26cadac24caf8434d5b570788bf444d8cb Mon Sep 17 00:00:00 2001 From: Vijay Date: Fri, 17 Aug 2012 20:37:30 +0530 Subject: [PATCH 07/28] CS-15830. If autoscale vm group creation is attempted on a unimplemented network an error is thrown. Enhancing the check to make sure AutoScaleVmGroup should have atleast 1 min member. --- server/src/com/cloud/network/as/AutoScaleManagerImpl.java | 2 +- .../com/cloud/network/lb/LoadBalancingRulesManagerImpl.java | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/server/src/com/cloud/network/as/AutoScaleManagerImpl.java b/server/src/com/cloud/network/as/AutoScaleManagerImpl.java index 460e8a4e159..980b06de653 100644 --- a/server/src/com/cloud/network/as/AutoScaleManagerImpl.java +++ b/server/src/com/cloud/network/as/AutoScaleManagerImpl.java @@ -843,7 +843,7 @@ public class AutoScaleManagerImpl implements AutoScaleService, Manager { if(vmGroup.getCreated() != null) ApiDBUtils.getAutoScaleVmGroupPolicyIds(vmGroup.getId(), bakupScaleUpPolicyIds, bakupScaleDownPolicyIds); - if (minMembers < 0) { + if (minMembers < 1) { throw new InvalidParameterValueException(ApiConstants.MIN_MEMBERS + " is an invalid value: " + minMembers, null); } diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java index bda4a92741b..c75548da715 100755 --- a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java +++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java @@ -286,6 +286,11 @@ public class LoadBalancingRulesManagerImpl implements LoadBalancingRulesMa if (zone.getNetworkType() == NetworkType.Advanced) { NetworkVO lbNetwork = _networkDao.findById(lbNetworkId); lbNetworkUuid = lbNetwork.getUuid(); + if (vmGroup.getState().equals(AutoScaleVmGroup.State_New)) { + if(!lbNetwork.getState().equals(Network.State.Implemented)) { + throw new InvalidParameterValueException("Network is not in implemented state", null); + } + } } } From 5cd487a4b27ccaf1ab1dde87dbb93a28a2ce7120 Mon Sep 17 00:00:00 2001 From: Deepak Garg Date: Fri, 17 Aug 2012 19:22:30 +0530 Subject: [PATCH 08/28] Adding the indexing of load_balancer_id to the create schema file to keep it consistent with the upgrade schema file. --- setup/db/create-schema.sql | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/setup/db/create-schema.sql b/setup/db/create-schema.sql index 933844a2beb..96e87af11b9 100755 --- a/setup/db/create-schema.sql +++ b/setup/db/create-schema.sql @@ -2433,7 +2433,8 @@ CREATE TABLE `cloud`.`autoscale_vmgroups` ( CONSTRAINT `fk_autoscale_vmgroups__account_id` FOREIGN KEY `fk_autoscale_vmgroups__account_id` (`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, CONSTRAINT `fk_autoscale_vmgroups__zone_id` FOREIGN KEY `fk_autoscale_vmgroups__zone_id`(`zone_id`) REFERENCES `data_center`(`id`), CONSTRAINT `uc_autoscale_vmgroups__uuid` UNIQUE (`uuid`), - INDEX `i_autoscale_vmgroups__removed`(`removed`) + INDEX `i_autoscale_vmgroups__removed`(`removed`), + INDEX `i_autoscale_vmgroups__load_balancer_id`(`load_balancer_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `cloud`.`autoscale_policy_condition_map` ( From 929b9bbeb3736e96e2db1fa2757f4575a7cb79ff Mon Sep 17 00:00:00 2001 From: Vijay Date: Fri, 17 Aug 2012 22:21:40 +0530 Subject: [PATCH 09/28] CS-16066. Autoscale ServiceGroup is updated to use Uuid NetScaler jar version updated to 10.0 74.152 --- .../cloud/agent/api/to/LoadBalancerTO.java | 10 +++++++-- .../network/resource/NetscalerResource.java | 19 ++++++++++++------ deps/cloud-netscaler.jar | Bin 3291866 -> 3292834 bytes 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/api/src/com/cloud/agent/api/to/LoadBalancerTO.java b/api/src/com/cloud/agent/api/to/LoadBalancerTO.java index 362b85ac6a0..44f7ab3f04c 100644 --- a/api/src/com/cloud/agent/api/to/LoadBalancerTO.java +++ b/api/src/com/cloud/agent/api/to/LoadBalancerTO.java @@ -361,6 +361,7 @@ public class LoadBalancerTO implements Serializable { } public static class AutoScaleVmGroupTO implements Serializable { + private final String uuid; private final int minMembers; private final int maxMembers; private final int memberPort; @@ -370,8 +371,9 @@ public class LoadBalancerTO implements Serializable { private final String state; private final String currentState; - AutoScaleVmGroupTO(int minMembers, int maxMembers, int memberPort, int interval, List policies, AutoScaleVmProfileTO profile, String state, String currentState) + AutoScaleVmGroupTO(String uuid, int minMembers, int maxMembers, int memberPort, int interval, List policies, AutoScaleVmProfileTO profile, String state, String currentState) { + this.uuid = uuid; this.minMembers = minMembers; this.maxMembers = maxMembers; this.memberPort = memberPort; @@ -382,6 +384,10 @@ public class LoadBalancerTO implements Serializable { this.currentState = currentState; } + public String getUuid() { + return uuid; + } + public int getMinMembers() { return minMembers; } @@ -444,7 +450,7 @@ public class LoadBalancerTO implements Serializable { autoScaleVmProfile.getSnmpPort(), autoScaleVmProfile.getDestroyVmGraceperiod()); AutoScaleVmGroup autoScaleVmGroup = lbAutoScaleVmGroup.getVmGroup(); - autoScaleVmGroupTO = new AutoScaleVmGroupTO(autoScaleVmGroup.getMinMembers(), autoScaleVmGroup.getMaxMembers(), autoScaleVmGroup.getMemberPort(), + autoScaleVmGroupTO = new AutoScaleVmGroupTO(autoScaleVmGroup.getUuid(), autoScaleVmGroup.getMinMembers(), autoScaleVmGroup.getMaxMembers(), autoScaleVmGroup.getMemberPort(), autoScaleVmGroup.getInterval(), autoScalePolicyTOs, autoScaleVmProfileTO, autoScaleVmGroup.getState(), lbAutoScaleVmGroup.getCurrentState()); } diff --git a/core/src/com/cloud/network/resource/NetscalerResource.java b/core/src/com/cloud/network/resource/NetscalerResource.java index 64980dc79cf..c295c51a947 100644 --- a/core/src/com/cloud/network/resource/NetscalerResource.java +++ b/core/src/com/cloud/network/resource/NetscalerResource.java @@ -1528,7 +1528,7 @@ public class NetscalerResource implements ServerResource { } addLBVirtualServer(nsVirtualServerName, srcIp, srcPort, lbAlgorithm, lbProtocol, loadBalancerTO.getStickinessPolicies(), vmGroupTO); - String serviceGroupName = generateAutoScaleServiceGroupName(vmGroupIdentifier); + String serviceGroupName = generateAutoScaleServiceGroupName(loadBalancerTO); servicegroup serviceGroup = getServiceGroupIfExisits(serviceGroupName); if(serviceGroup == null) { // add servicegroup lb_autoscaleGroup -autoscale POLICY -memberPort 80 @@ -1571,7 +1571,7 @@ public class NetscalerResource implements ServerResource { String vmGroupIdentifier = generateAutoScaleVmGroupIdentifier(loadBalancerTO); String nsVirtualServerName = generateNSVirtualServerName(srcIp, srcPort); - String serviceGroupName = generateAutoScaleServiceGroupName(vmGroupIdentifier); + String serviceGroupName = generateAutoScaleServiceGroupName(loadBalancerTO); if(loadBalancerTO.getAutoScaleVmGroupTO().getCurrentState().equals("enabled")) { disableAutoScaleConfig(loadBalancerTO, false); @@ -1613,7 +1613,7 @@ public class NetscalerResource implements ServerResource { int srcPort = loadBalancerTO.getSrcPort(); String nsVirtualServerName = generateNSVirtualServerName(srcIp, srcPort); - String serviceGroupName = generateAutoScaleServiceGroupName(vmGroupIdentifier); + String serviceGroupName = generateAutoScaleServiceGroupName(loadBalancerTO); String profileName = generateAutoScaleProfileName(vmGroupIdentifier); String timerName = generateAutoScaleTimerName(vmGroupIdentifier); String scaleDownActionName = generateAutoScaleScaleDownActionName(vmGroupIdentifier); @@ -1923,7 +1923,7 @@ public class NetscalerResource implements ServerResource { String scaleUpActionName = generateAutoScaleScaleUpActionName(vmGroupIdentifier); String mtName = generateSnmpMetricTableName(vmGroupIdentifier); String monitorName = generateSnmpMonitorName(vmGroupIdentifier); - String serviceGroupName = generateAutoScaleServiceGroupName(vmGroupIdentifier); + String serviceGroupName = generateAutoScaleServiceGroupName(loadBalancerTO); AutoScaleVmGroupTO vmGroupTO = loadBalancerTO.getAutoScaleVmGroupTO(); List policies = vmGroupTO.getPolicies(); String minMemberPolicyName = generateAutoScaleMinPolicyName(vmGroupIdentifier); @@ -2231,8 +2231,15 @@ public class NetscalerResource implements ServerResource { return lbTO.getSrcIp() + "-" + lbTO.getSrcPort(); } - private String generateAutoScaleServiceGroupName(String vmGroupIdentifier) { - return genObjectName("Cloud-AutoScale-SvcGrp", vmGroupIdentifier); + private String generateAutoScaleServiceGroupName(LoadBalancerTO lbTO) { + /* + * ServiceGroup name in NetScaler wont support long names. Providing special name. + * Need for introducing uuid because every vmgroup creation should be distinguished. + * Ex. (1) create a vm group, delete a vmgroup, create a vmgroup on same lb ip and port + * This will reuse all vms from the original vm group in step (1) + */ + + return "Cloud" + lbTO.getAutoScaleVmGroupTO().getUuid().replace("-", ""); } private String generateAutoScaleTimerName(String vmGroupIdentifier) { diff --git a/deps/cloud-netscaler.jar b/deps/cloud-netscaler.jar index 0cf1820f86e9a0434f834b9fd1e68acb7eb3dc24..8134cba102f1849503ddb571bd52bf8b268a30ac 100755 GIT binary patch delta 233636 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%0A1Xa81iqR!2sNV+X`EUYH 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

-VXOwP5hVO%2fcF{L0NB-% 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

~=ykzK#=4qteN)6lf0gPdtZYBtR&`2^HhO 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

^j6{|NP6njH2|Ee$_L>8u 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 From f1c77e84dd8a782a5cd41e48ce786c25c6f8250f Mon Sep 17 00:00:00 2001 From: Sheng Yang Date: Fri, 17 Aug 2012 10:54:20 -0700 Subject: [PATCH 10/28] CS-16060: Firewall service should be excluded from conserve mode checking --- server/src/com/cloud/network/NetworkManagerImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index a1784bc6e82..59812eab73f 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -877,6 +877,9 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag if (!offering.isConserveMode()) { for (PublicIp ip : ipToServices.keySet()) { Set services = ipToServices.get(ip); + if (services != null && services.contains(Service.Firewall)) { + services.remove(Service.Firewall); + } if (services != null && services.size() > 1) { throw new CloudRuntimeException("Ip " + ip.getAddress() + " is used by multiple services!"); } From 4b4d4555f3dcce749651b572470b633eb1918803 Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Fri, 17 Aug 2012 11:42:31 -0700 Subject: [PATCH 11/28] CS-15863: cloudstack 3.0 UI - (1) extend multiEdit widget to be able to hide actions upon an each item's properties. (2) IP Addresses page - load balancer listing - VM listing - hide destroy action for autoscale VM. --- ui/scripts/network.js | 5 +++++ ui/scripts/ui/widgets/multiEdit.js | 6 +++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/ui/scripts/network.js b/ui/scripts/network.js index f3c5f7359b0..166bed31c4b 100644 --- a/ui/scripts/network.js +++ b/ui/scripts/network.js @@ -2610,6 +2610,11 @@ success: function(data) { lbInstances = data.listloadbalancerruleinstancesresponse.loadbalancerruleinstance ? data.listloadbalancerruleinstancesresponse.loadbalancerruleinstance : []; + + $(lbInstances).each(function() { + if(this.name.indexOf('AutoScale-LB-') > -1) //autoscale VM is not allowed to be deleted manually. So, hide destroy button + this._hideActions = ['destroy']; + }); }, error: function(data) { args.response.error(parseXMLHttpResponse(data)); diff --git a/ui/scripts/ui/widgets/multiEdit.js b/ui/scripts/ui/widgets/multiEdit.js index c29673cc807..c4cdf92ef33 100644 --- a/ui/scripts/ui/widgets/multiEdit.js +++ b/ui/scripts/ui/widgets/multiEdit.js @@ -622,7 +622,11 @@ var $itemActions = $('').addClass('actions item-actions'); $.each(itemActions, function(itemActionID, itemAction) { - if (itemActionID == 'add') return true; + if (itemActionID == 'add') + return true; + + if(item._hideActions != null && $.inArray(itemActionID, item._hideActions) > -1) + return true; var $itemAction = $('

').addClass('action').addClass(itemActionID); From 4d7c6f43ac66f0b9c8acf6a273b647152983ce61 Mon Sep 17 00:00:00 2001 From: Vijayendra Bhamidipati Date: Fri, 17 Aug 2012 12:23:13 -0700 Subject: [PATCH 12/28] CS-16042: 3.0.x to 3.0.5 Upgrade: VMWare : Upgrade Procedure for using the new Burbank System Template in place of Acton System Template Required Description: Updating system VM template for vmware for 3.0.5. --- .../cloud/upgrade/dao/Upgrade304to305.java | 51 ++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) diff --git a/server/src/com/cloud/upgrade/dao/Upgrade304to305.java b/server/src/com/cloud/upgrade/dao/Upgrade304to305.java index bba46ed7fbd..3cb02ac33a9 100644 --- a/server/src/com/cloud/upgrade/dao/Upgrade304to305.java +++ b/server/src/com/cloud/upgrade/dao/Upgrade304to305.java @@ -60,6 +60,7 @@ public class Upgrade304to305 extends Upgrade30xBase implements DbUpgrade { addVpcProvider(conn); updateRouterNetworkRef(conn); correctNetworkUsingExternalDevices(conn); + updateSystemVms(conn); } @Override @@ -71,7 +72,55 @@ public class Upgrade304to305 extends Upgrade30xBase implements DbUpgrade { return new File[] { new File(script) }; } - + + private void updateSystemVms(Connection conn){ + PreparedStatement pstmt = null; + ResultSet rs = null; + boolean VMware = false; + try { + pstmt = conn.prepareStatement("select distinct(hypervisor_type) from `cloud`.`cluster` where removed is null"); + rs = pstmt.executeQuery(); + while(rs.next()){ + if("VMware".equals(rs.getString(1))){ + VMware = true; + } + } + } catch (SQLException e) { + throw new CloudRuntimeException("Error while iterating through list of hypervisors in use", e); + } + // Just update the VMware system template. Other hypervisor templates are unchanged from previous 3.0.x versions. + s_logger.debug("Updating VMware System Vms"); + try { + //Get 3.0.5 VMware system Vm template Id + pstmt = conn.prepareStatement("select id from `cloud`.`vm_template` where name = 'systemvm-vmware-3.0.5' and removed is null"); + rs = pstmt.executeQuery(); + if(rs.next()){ + long templateId = rs.getLong(1); + rs.close(); + pstmt.close(); + // change template type to SYSTEM + pstmt = conn.prepareStatement("update `cloud`.`vm_template` set type='SYSTEM' where id = ?"); + pstmt.setLong(1, templateId); + pstmt.executeUpdate(); + pstmt.close(); + // update templete ID of system Vms + pstmt = conn.prepareStatement("update `cloud`.`vm_instance` set vm_template_id = ? where type <> 'User' and hypervisor_type = 'VMware'"); + pstmt.setLong(1, templateId); + pstmt.executeUpdate(); + pstmt.close(); + } else { + if (VMware){ + throw new CloudRuntimeException("3.0.5 VMware SystemVm template not found. Cannot upgrade system Vms"); + } else { + s_logger.warn("3.0.5 VMware SystemVm template not found. VMware hypervisor is not used, so not failing upgrade"); + } + } + } catch (SQLException e) { + throw new CloudRuntimeException("Error while updating VMware systemVm template", e); + } + s_logger.debug("Updating System Vm Template IDs Complete"); + } + private void addVpcProvider(Connection conn){ //Encrypt config params and change category to Hidden s_logger.debug("Adding vpc provider to all physical networks in the system"); From a38704902e6bf9259e97e07ee04c5e84a8d3e3d7 Mon Sep 17 00:00:00 2001 From: Pranav Saxena Date: Sat, 18 Aug 2012 00:56:36 +0530 Subject: [PATCH 13/28] CS-15927:Filter to hide the autoscale VM's through a Regular expression Reviewed-By Brian --- ui/scripts/network.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/ui/scripts/network.js b/ui/scripts/network.js index 166bed31c4b..1bce9854c93 100644 --- a/ui/scripts/network.js +++ b/ui/scripts/network.js @@ -2204,12 +2204,20 @@ data.listvirtualmachinesresponse.virtualmachine ? data.listvirtualmachinesresponse.virtualmachine : [], function(instance) { + // Hiding the AutoScale VMs + var nonAutoScale=0; + if( instance.name.match(/AutoScale-LB-/)==null) + nonAutoScale =1; + else { + if(instance.name.match(/AutoScale-LB-/).length) + nonAutoScale =0; + } var isActiveState = $.inArray(instance.state, ['Destroyed']) == -1; var notExisting = !$.grep(itemData, function(item) { return item.id == instance.id; - }).length; + }).length; - return isActiveState && notExisting; + return nonAutoScale && isActiveState && notExisting ; } ); From d6092380cd26aefa24afc759d6c84e772b3c09f6 Mon Sep 17 00:00:00 2001 From: Edison Su Date: Fri, 17 Aug 2012 12:54:02 -0700 Subject: [PATCH 14/28] HA worker thread needs to have its own worker thread configuration --- server/src/com/cloud/configuration/Config.java | 1 + server/src/com/cloud/ha/HighAvailabilityManagerImpl.java | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/server/src/com/cloud/configuration/Config.java b/server/src/com/cloud/configuration/Config.java index ba5ee55a8e4..e4c7362c37e 100755 --- a/server/src/com/cloud/configuration/Config.java +++ b/server/src/com/cloud/configuration/Config.java @@ -173,6 +173,7 @@ public enum Config { XapiWait("Advanced", AgentManager.class, Integer.class, "xapiwait", "600", "Time (in seconds) to wait for XAPI to return", null), MigrateWait("Advanced", AgentManager.class, Integer.class, "migratewait", "3600", "Time (in seconds) to wait for VM migrate finish", null), Workers("Advanced", AgentManager.class, Integer.class, "workers", "5", "Number of worker threads.", null), + HAWorkers("Advanced", AgentManager.class, Integer.class, "ha.workers", "5", "Number of ha worker threads.", null), MountParent("Advanced", ManagementServer.class, String.class, "mount.parent", "/var/lib/cloud/management/mnt", "The mount point on the Management Server for Secondary Storage.", null), // UpgradeURL("Advanced", ManagementServer.class, String.class, "upgrade.url", "http://example.com:8080/client/agent/update.zip", "The upgrade URL is the URL of the management server that agents will connect to in order to automatically upgrade.", null), SystemVMUseLocalStorage("Advanced", ManagementServer.class, Boolean.class, "system.vm.use.local.storage", "false", "Indicates whether to use local storage pools or shared storage pools for system VMs.", null), diff --git a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java index 17008d331bd..132cc0e21d3 100755 --- a/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java +++ b/server/src/com/cloud/ha/HighAvailabilityManagerImpl.java @@ -33,6 +33,7 @@ import com.cloud.alert.AlertManager; import com.cloud.cluster.ClusterManagerListener; import com.cloud.cluster.ManagementServerHostVO; import com.cloud.cluster.StackMaid; +import com.cloud.configuration.Config; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.dc.ClusterDetailsDao; import com.cloud.dc.DataCenterVO; @@ -699,7 +700,7 @@ public class HighAvailabilityManagerImpl implements HighAvailabilityManager, Clu params = configDao.getConfiguration(Long.toHexString(_serverId), xmlParams); } - String value = params.get("workers"); + String value = params.get(Config.HAWorkers.key()); final int count = NumbersUtil.parseInt(value, 1); _workers = new WorkerThread[count]; for (int i = 0; i < _workers.length; i++) { From abcd5677c0cd389e584b505669652193e59da116 Mon Sep 17 00:00:00 2001 From: frank Date: Fri, 17 Aug 2012 14:20:22 -0700 Subject: [PATCH 15/28] CS-16059 2.2.14 to 3.0.5 : Upgrade is failing fixed --- setup/db/db/schema-2214to30.sql | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/setup/db/db/schema-2214to30.sql b/setup/db/db/schema-2214to30.sql index 6584db217c1..0accb6aa829 100755 --- a/setup/db/db/schema-2214to30.sql +++ b/setup/db/db/schema-2214to30.sql @@ -721,6 +721,20 @@ UPDATE `cloud`.`network_offerings` SET display_text='Offering for Shared Securit UPDATE `cloud`.`configuration` SET category = 'Secure' where name in ('alert.smtp.password', 'network.loadbalancer.haproxy.stats.auth', 'security.singlesignon.key', 'project.smtp.password'); UPDATE `cloud`.`configuration` SET category = 'Hidden' where name in ('secondary.storage.vm', 'xen.create.pools.in.pod', 'cloud.identifier', 'security.hash.key', 'router.ram.size'); + +UPDATE `cloud`.`guest_os` set id = 158 where id = 141; +UPDATE `cloud`.`guest_os` set id = 159 where id = 142; +UPDATE `cloud`.`guest_os` set id = 160 where id = 143; +UPDATE `cloud`.`vm_template` set guest_os_id = 158 where guest_os_id = 141; +UPDATE `cloud`.`vm_template` set guest_os_id = 159 where guest_os_id = 142; +UPDATE `cloud`.`vm_template` set guest_os_id = 160 where guest_os_id = 143; +UPDATE `cloud`.`vm_instance` set guest_os_id = 158 where guest_os_id = 141; +UPDATE `cloud`.`vm_instance` set guest_os_id = 159 where guest_os_id = 142; +UPDATE `cloud`.`vm_instance` set guest_os_id = 160 where guest_os_id = 143; +UPDATE `cloud`.`guest_os_hypervisor` set guest_os_id = 158 where guest_os_id = 141; +UPDATE `cloud`.`guest_os_hypervisor` set guest_os_id = 159 where guest_os_id = 142; +UPDATE `cloud`.`guest_os_hypervisor` set guest_os_id = 160 where guest_os_id = 143; + INSERT IGNORE INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (143, 1, 'CentOS 6.0 (32-bit)'); INSERT IGNORE INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (144, 1, 'CentOS 6.0 (64-bit)'); INSERT IGNORE INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (145, 3, 'Oracle Enterprise Linux 5.6 (32-bit)'); From 70d41f103b9c59b502a4f0cdd7a92533905fa365 Mon Sep 17 00:00:00 2001 From: frank Date: Fri, 17 Aug 2012 14:39:20 -0700 Subject: [PATCH 16/28] CS-15971 Host going to disconnected state after upgrade from 2.2.14 to 3.0.5 fixed --- setup/db/db/schema-2214to30.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/setup/db/db/schema-2214to30.sql b/setup/db/db/schema-2214to30.sql index 0accb6aa829..809b1984071 100755 --- a/setup/db/db/schema-2214to30.sql +++ b/setup/db/db/schema-2214to30.sql @@ -759,3 +759,5 @@ UPDATE `cloud`.`networks` n SET n.display_text=(CONCAT('guestNetworkForBasicZon UPDATE `cloud`.`configuration` SET description='Bypass internal dns, use external dns1 and dns2' WHERE name='use.external.dns'; UPDATE `cloud`.`configuration` SET category='Alert' WHERE name='capacity.check.period'; UPDATE `cloud`.`vm_instance` SET vnc_password = '' where removed is not null; + +DELETE FROM `cloud`.`host_details` where name in ('storage.network.device1', 'storage.network.device2'); From 91bd6d96d944f1125870aad0079d20f2df533ba9 Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Fri, 17 Aug 2012 14:43:29 -0700 Subject: [PATCH 17/28] CS-16046: cloudstack 3.0 UI - Edit zone - Local Storage Enabled field is a true/false field. Make it a checkbox in Edit mode. --- ui/scripts/system.js | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/ui/scripts/system.js b/ui/scripts/system.js index 2ee9a21e3d3..51179d37750 100644 --- a/ui/scripts/system.js +++ b/ui/scripts/system.js @@ -3967,7 +3967,7 @@ array1.push("&internaldns1=" + todb(args.data.internaldns1)); array1.push("&internaldns2=" + todb(args.data.internaldns2)); //internaldns2 can be empty ("") when passed to API array1.push("&domain=" + todb(args.data.domain)); - array1.push("&localstorageenabled=" + todb(args.data.localstorageenabled)); + array1.push("&localstorageenabled=" + (args.data.localstorageenabled == 'on')); $.ajax({ url: createURL("updateZone&id=" + args.context.physicalResources[0].id + array1.join("")), dataType: "json", @@ -4014,13 +4014,9 @@ }, localstorageenabled: { label: 'label.local.storage.enabled', - converter: function(args) { - if(args) - return "true"; - else - return "false"; - }, - isEditable: true + isBoolean: true, + isEditable: true, + converter:cloudStack.converters.toBooleanText } } ], From 0cf0523afec89d2b6ced94adde06d4db1d2d86ce Mon Sep 17 00:00:00 2001 From: Vijayendra Bhamidipati Date: Fri, 17 Aug 2012 15:59:35 -0700 Subject: [PATCH 18/28] CS-16042: 3.0.x to 3.0.5 Upgrade: VMWare : Upgrade Procedure for using the new Burbank System Template in place of Acton System Template Required Description: Modifying reference to system VM template for vmware for the 2.2.14 to 3.0 upgrade path so that it picks up the burbank template if upgrading from 2.2.14 to 3.0.5 or beyond, and the acton template if upgrading from 2.2.14 to 3.0.[0-4]. --- server/src/com/cloud/maint/Version.java | 5 ++++ .../cloud/upgrade/dao/Upgrade2214to30.java | 28 ++++++++++++++++++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/server/src/com/cloud/maint/Version.java b/server/src/com/cloud/maint/Version.java index f7ff7835b8d..80b0f3f9a9f 100644 --- a/server/src/com/cloud/maint/Version.java +++ b/server/src/com/cloud/maint/Version.java @@ -46,6 +46,11 @@ public class Version { String[] tokens = version.split("[.]"); return tokens[0] + "." + tokens[1]+ "." + tokens[2]; } + + public static String trimToPatchNormalized(String version) { + String[] tokens = version.split("[.]"); + return tokens[0] + tokens[1] + tokens[2]; + } public static void main(String[] args) { System.out.println("Result is " + compare(args[0], args[1])); diff --git a/server/src/com/cloud/upgrade/dao/Upgrade2214to30.java b/server/src/com/cloud/upgrade/dao/Upgrade2214to30.java index 36450789368..f0943f8140b 100755 --- a/server/src/com/cloud/upgrade/dao/Upgrade2214to30.java +++ b/server/src/com/cloud/upgrade/dao/Upgrade2214to30.java @@ -27,6 +27,7 @@ import java.util.UUID; import org.apache.log4j.Logger; +import com.cloud.maint.Version; import com.cloud.offering.NetworkOffering; import com.cloud.utils.crypt.DBEncryptionUtil; import com.cloud.utils.crypt.EncryptionSecretKeyChecker; @@ -666,7 +667,32 @@ public class Upgrade2214to30 extends Upgrade30xBase implements DbUpgrade { s_logger.debug("Updating VMware System Vms"); try { //Get 3.0.0 VMware system Vm template Id - pstmt = conn.prepareStatement("select id from `cloud`.`vm_template` where name = 'systemvm-vmware-3.0.0' and removed is null"); + // First get the current version of the Mgmt server from the db. + String curDbVersion = ""; + String trimmedCurrentVersion = ""; + pstmt = conn.prepareStatement("select version from `cloud`.`version`"); + try { + rs = pstmt.executeQuery(); + if(rs.next()) { + curDbVersion = rs.getString(1); + rs.close(); + pstmt.close(); + } else + throw new CloudRuntimeException("Couldn't retrieve current version from db"); + } catch (SQLException e) { + throw new CloudRuntimeException("Encountered sql exception : Couldn't retrieve current version from db"); + } + if (curDbVersion != null) { + trimmedCurrentVersion = Version.trimToPatchNormalized(curDbVersion); + } + // If the current version is >= 3.0.5, use the new burbank template. + if (Long.valueOf(trimmedCurrentVersion).longValue() >= 305 ) { + s_logger.info("Using 3.0.5 vmware system vm template"); + pstmt = conn.prepareStatement("select id from `cloud`.`vm_template` where name = 'systemvm-vmware-3.0.5' and removed is null"); + } else { + s_logger.info("Using 3.0.0 vmware system vm template"); + pstmt = conn.prepareStatement("select id from `cloud`.`vm_template` where name = 'systemvm-vmware-3.0.0' and removed is null"); + } rs = pstmt.executeQuery(); if(rs.next()){ long templateId = rs.getLong(1); From d158b38007e8b4106b10300c18eb0e62b26a2795 Mon Sep 17 00:00:00 2001 From: Alena Prokharchyk Date: Fri, 17 Aug 2012 16:25:04 -0700 Subject: [PATCH 19/28] More logging to lock operations on the network --- server/src/com/cloud/network/NetworkManagerImpl.java | 11 ++++++++--- .../router/VirtualNetworkApplianceManagerImpl.java | 7 +++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index 59812eab73f..ffe3eee17f8 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -1921,6 +1921,10 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag ex.addProxyObject("networks", networkId, "networkId"); throw ex; } + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Lock is acquired for network id " + networkId + " as a part of network implement"); + } try { NetworkGuru guru = _networkGurus.get(network.getGuruName()); @@ -1966,10 +1970,11 @@ public class NetworkManagerImpl implements NetworkManager, NetworkService, Manag shutdownNetwork(networkId, context, false); } - if (s_logger.isDebugEnabled()) { - s_logger.debug("Releasing lock for network id " + networkId); - } + _networksDao.releaseFromLockTable(networkId); + if (s_logger.isDebugEnabled()) { + s_logger.debug("Lock is released for network id " + networkId + " as a part of network implement"); + } } } diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index 47421425383..4182c29c19e 100755 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -1386,6 +1386,10 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian if (network == null) { throw new ConcurrentOperationException("Unable to lock network " + guestNetwork.getId()); } + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Lock is acquired for network id " + network.getId() + " as a part of router startup in " + dest); + } try { // Check if providers are supported in the physical networks @@ -1439,6 +1443,9 @@ public class VirtualNetworkApplianceManagerImpl implements VirtualNetworkApplian } finally { if (network != null) { _networkDao.releaseFromLockTable(network.getId()); + if (s_logger.isDebugEnabled()) { + s_logger.debug("Lock is released for network id " + network.getId() + " as a part of router startup in " + dest); + } } } return routers; From e57d26e114d977302b59b8f5d423c803bd62b57e Mon Sep 17 00:00:00 2001 From: Vijayendra Bhamidipati Date: Fri, 17 Aug 2012 19:29:32 -0700 Subject: [PATCH 20/28] CS-16076: Upgrade Fail 2.2.14 -> Burbank VMware template replacement - Unable to execute upgrade script: /usr/share/cloud/setup/db/schema-302to303.sql Description: Ignoring duplicate key failures during upgradation. --- setup/db/db/schema-302to303.sql | 38 ++++++++++++++++----------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/setup/db/db/schema-302to303.sql b/setup/db/db/schema-302to303.sql index a16a9f042b7..4da78f7d899 100755 --- a/setup/db/db/schema-302to303.sql +++ b/setup/db/db/schema-302to303.sql @@ -170,22 +170,22 @@ DELETE FROM `cloud`.`storage_pool_host_ref` WHERE pool_id IN (SELECT id FROM sto ALTER TABLE `cloud`.`service_offering` MODIFY `nw_rate` smallint(5) unsigned DEFAULT '200' COMMENT 'network rate throttle mbits/s'; -INSERT INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (141, 1, 'CentOS 5.6 (32-bit)'); -INSERT INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (142, 1, 'CentOS 5.6 (64-bit)'); -INSERT INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (143, 1, 'CentOS 6.0 (32-bit)'); -INSERT INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (144, 1, 'CentOS 6.0 (64-bit)'); -INSERT INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (145, 3, 'Oracle Enterprise Linux 5.6 (32-bit)'); -INSERT INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (146, 3, 'Oracle Enterprise Linux 5.6 (64-bit)'); -INSERT INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (147, 3, 'Oracle Enterprise Linux 6.0 (32-bit)'); -INSERT INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (148, 3, 'Oracle Enterprise Linux 6.0 (64-bit)'); -INSERT INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (149, 4, 'Red Hat Enterprise Linux 5.6 (32-bit)'); -INSERT INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (150, 4, 'Red Hat Enterprise Linux 5.6 (64-bit)'); -INSERT INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (151, 5, 'SUSE Linux Enterprise Server 10 SP3 (32-bit)'); -INSERT INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (152, 5, 'SUSE Linux Enterprise Server 10 SP4 (64-bit)'); -INSERT INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (153, 5, 'SUSE Linux Enterprise Server 10 SP4 (32-bit)'); -INSERT INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (154, 5, 'SUSE Linux Enterprise Server 11 SP1 (64-bit)'); -INSERT INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (155, 5, 'SUSE Linux Enterprise Server 11 SP1 (32-bit)'); -INSERT INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (156, 10, 'Ubuntu 10.10 (32-bit)'); -INSERT INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (157, 10, 'Ubuntu 10.10 (64-bit)'); -INSERT INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (161, 1, 'CentOS 5.7 (32-bit)'); -INSERT INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (162, 1, 'CentOS 5.7 (64-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (141, 1, 'CentOS 5.6 (32-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (142, 1, 'CentOS 5.6 (64-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (143, 1, 'CentOS 6.0 (32-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (144, 1, 'CentOS 6.0 (64-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (145, 3, 'Oracle Enterprise Linux 5.6 (32-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (146, 3, 'Oracle Enterprise Linux 5.6 (64-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (147, 3, 'Oracle Enterprise Linux 6.0 (32-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (148, 3, 'Oracle Enterprise Linux 6.0 (64-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (149, 4, 'Red Hat Enterprise Linux 5.6 (32-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (150, 4, 'Red Hat Enterprise Linux 5.6 (64-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (151, 5, 'SUSE Linux Enterprise Server 10 SP3 (32-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (152, 5, 'SUSE Linux Enterprise Server 10 SP4 (64-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (153, 5, 'SUSE Linux Enterprise Server 10 SP4 (32-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (154, 5, 'SUSE Linux Enterprise Server 11 SP1 (64-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (155, 5, 'SUSE Linux Enterprise Server 11 SP1 (32-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (156, 10, 'Ubuntu 10.10 (32-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (157, 10, 'Ubuntu 10.10 (64-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (161, 1, 'CentOS 5.7 (32-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (162, 1, 'CentOS 5.7 (64-bit)'); From bce2657c06e7073618569529aa655d72429ae9fb Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Sat, 18 Aug 2012 12:26:46 +0530 Subject: [PATCH 21/28] Permissions were executable, modified to only read --- test/integration/component/test_security_keys_encryption.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 test/integration/component/test_security_keys_encryption.py diff --git a/test/integration/component/test_security_keys_encryption.py b/test/integration/component/test_security_keys_encryption.py old mode 100755 new mode 100644 From c14928757acba126b2b15e3b3277d653df0a62b2 Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Sat, 18 Aug 2012 13:37:12 +0530 Subject: [PATCH 22/28] migrating tags to attr decorators for nose attrib classification --- .../component/test_host_high_availability.py | 7 ++++ .../component/test_netscaler_configs.py | 38 +++++++++---------- .../component/test_netscaler_lb.py | 36 +++++++++--------- .../component/test_netscaler_lb_algo.py | 18 ++++----- .../component/test_netscaler_lb_sticky.py | 18 ++++----- .../component/test_netscaler_nw_off.py | 20 +++++----- .../component/test_network_offering.py | 12 +++--- .../component/test_project_configs.py | 6 +-- .../component/test_project_limits.py | 6 +-- .../component/test_project_resources.py | 16 ++++---- .../component/test_project_usage.py | 18 ++++----- test/integration/component/test_projects.py | 20 +++++----- .../component/test_resource_limits.py | 32 ++++++++-------- test/integration/component/test_routers.py | 12 +++--- .../component/test_security_groups.py | 24 ++++++------ .../test_security_keys_encryption.py | 10 ++--- test/integration/component/test_snapshots.py | 10 ++--- test/integration/component/test_stopped_vm.py | 34 ++++++++--------- test/integration/component/test_templates.py | 10 ++--- .../component/test_upload_volumes.py | 14 +++---- test/integration/component/test_usage.py | 18 ++++----- test/integration/component/test_vmware_drs.py | 8 ++-- test/integration/component/test_volumes.py | 14 +++---- 23 files changed, 204 insertions(+), 197 deletions(-) diff --git a/test/integration/component/test_host_high_availability.py b/test/integration/component/test_host_high_availability.py index a019c0970f4..fd1dd28e5bf 100644 --- a/test/integration/component/test_host_high_availability.py +++ b/test/integration/component/test_host_high_availability.py @@ -146,6 +146,8 @@ class TestHostHighAvailability(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + + @attr(tags = ["advanced", "advancedns", "sg", "basic", "eip", "simulator"]) def test_01_vm_deployment_with_compute_offering_with_ha_enabled(self): """ Test VM deployments (Create HA enabled Compute Service Offering and VM) """ @@ -209,6 +211,7 @@ class TestHostHighAvailability(cloudstackTestCase): "VM not created with HA enable tag" ) + @attr(tags = ["advanced", "advancedns", "sg", "basic", "eip", "simulator"]) def test_02_no_vm_creation_on_host_with_haenabled(self): """ Verify you can not create new VMs on hosts with an ha.tag """ @@ -332,6 +335,7 @@ class TestHostHighAvailability(cloudstackTestCase): "VM migrated to HA enabled host." ) + @attr(tags = ["advanced", "advancedns", "sg", "basic", "eip", "simulator"]) def test_03_cant_migrate_vm_to_host_with_ha_positive(self): """ Verify you can not migrate VMs to hosts with an ha.tag (positive) """ @@ -436,6 +440,7 @@ class TestHostHighAvailability(cloudstackTestCase): "The VM is not migrated to targeted suitable host." ) + @attr(tags = ["advanced", "advancedns", "sg", "basic", "eip", "simulator"]) def test_04_cant_migrate_vm_to_host_with_ha_negative(self): """ Verify you can not migrate VMs to hosts with an ha.tag (negative) """ @@ -539,6 +544,7 @@ class TestHostHighAvailability(cloudstackTestCase): "The detination host id of migrated VM is not matching." ) + @attr(tags = ["advanced", "advancedns", "sg", "basic", "eip", "simulator"]) def test_05_no_vm_with_ha_gets_migrated_to_ha_host_in_live_migration(self): """ Verify that none of the VMs with HA enabled migrate to an ha tagged host during live migration """ @@ -668,6 +674,7 @@ class TestHostHighAvailability(cloudstackTestCase): cmd.id = vm_with_ha_enabled.hostid self.apiclient.cancelHostMaintenance(cmd) + @attr(tags = ["advanced", "advancedns", "sg", "basic", "eip", "simulator"]) def test_06_no_vm_without_ha_gets_migrated_to_ha_host_in_live_migration(self): """ Verify that none of the VMs without HA enabled migrate to an ha tagged host during live migration """ diff --git a/test/integration/component/test_netscaler_configs.py b/test/integration/component/test_netscaler_configs.py index ed4c654842b..24083028f17 100644 --- a/test/integration/component/test_netscaler_configs.py +++ b/test/integration/component/test_netscaler_configs.py @@ -188,10 +188,10 @@ class TestAddNetScaler(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_add_netscaler_device(self): """Test add netscaler device """ - tags = ["advancedns"] # Validate the following # 1. Add Netscaler device into a Zone by providing valid log in # credentials , public , private interface and enabling Load @@ -314,10 +314,10 @@ class TestInvalidParametersNetscaler(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_invalid_cred(self): """Test add netscaler device with invalid credential """ - tags = ["advancedns"] # Validate the following # 1. Add Netscaler device into a Zone by providing invalid log in @@ -383,10 +383,10 @@ class TestInvalidParametersNetscaler(cloudstackTestCase): ) return + @attr(tags = ["advancedns"]) def test_invalid_public_interface(self): """Test add netscaler device with invalid public interface """ - tags = ["advancedns"] # Validate the following # 1. Add Netscaler device into a Zone by providing valid log in @@ -450,10 +450,10 @@ class TestInvalidParametersNetscaler(cloudstackTestCase): ) return + @attr(tags = ["advancedns"]) def test_invalid_private_interface(self): """Test add netscaler device with invalid private interface """ - tags = ["advancedns"] # Validate the following # 1. Add Netscaler device into a Zone by providing valid log in @@ -635,10 +635,10 @@ class TestNetScalerDedicated(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_netscaler_dedicated_mode(self): """Test netscaler device in dedicated mode """ - tags = ["advancedns"] # Validate the following # 1. Add Netscaler device in dedicated mode. @@ -854,10 +854,10 @@ class TestNetScalerShared(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_netscaler_shared_mode(self): """Test netscaler device in shared mode """ - tags = ["advancedns"] # Validate the following # 1. Add Netscaler device in shared mode. @@ -1103,10 +1103,10 @@ class TestNetScalerCustomCapacity(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_netscaler_custom_capacity(self): """Test netscaler device with custom capacity """ - tags = ["advancedns"] # Validate the following # 1. Add Netscaler device in shared mode with capacity 3 @@ -1376,10 +1376,10 @@ class TestNetScalerNoCapacity(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_netscaler_no_capacity(self): """Test netscaler device with no capacity remaining """ - tags = ["advancedns"] # Validate the following # 1. Add Netscaler device in shared mode with capacity 2 @@ -1644,10 +1644,10 @@ class TestGuestNetworkWithNetScaler(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_01_guest_network(self): """Implementing Guest Network when first VM gets deployed using the network having Netscaler as LB """ - tags = ["advancedns"] # Validate the following # 1. Configure Netscaler for load balancing. @@ -1764,10 +1764,10 @@ class TestGuestNetworkWithNetScaler(cloudstackTestCase): (self.services["netscaler"]["ipaddress"], e)) return + @attr(tags = ["advancedns"]) def test_02_guest_network_multiple(self): """Implementing Guest Network when multiple VMs gets deployed using the network having Netscaler as LB """ - tags = ["advancedns"] # Validate the following # 1. Configure Netscaler for load balancing. @@ -1930,10 +1930,10 @@ class TestGuestNetworkWithNetScaler(cloudstackTestCase): (self.services["netscaler"]["ipaddress"], e)) return + @attr(tags = ["advancedns"]) def test_03_delete_account(self): """Delete an account that has LB rules """ - tags = ["advancedns"] # Validate the following # 1. Acquire an ipaddress. Create multiple Lb rules on this ip address @@ -2210,10 +2210,10 @@ class TestGuestNetworkShutDown(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_01_stop_all_vms(self): """Test Stopping all the Vms for any account that has LB rules. """ - tags = ["advancedns"] # Validate the following # 1. Acquire IP address and create a load balancer rule @@ -2291,10 +2291,10 @@ class TestGuestNetworkShutDown(cloudstackTestCase): (self.services["netscaler"]["ipaddress"], e)) return + @attr(tags = ["advancedns"]) def test_02_start_one_vm(self): """Test LB rules on Netscaler after starting one Vm in account """ - tags = ["advancedns"] # Validate the following # 1. Acquire IP address and create a load balancer rule @@ -2376,10 +2376,10 @@ class TestGuestNetworkShutDown(cloudstackTestCase): (self.services["netscaler"]["ipaddress"], e)) return + @attr(tags = ["advancedns"]) def test_03_network_restart_without_cleanup(self): """Test LB rules on Netscaler after network restart without cleanup """ - tags = ["advancedns"] # Validate the following # 1. Acquire IP address and create a load balancer rule @@ -2438,10 +2438,10 @@ class TestGuestNetworkShutDown(cloudstackTestCase): (self.services["netscaler"]["ipaddress"], e)) return + @attr(tags = ["advancedns"]) def test_04_network_restart_with_cleanup(self): """Test LB rules on Netscaler after network restart with cleanup """ - tags = ["advancedns"] # Validate the following # 1. Acquire IP address and create a load balancer rule @@ -2614,10 +2614,10 @@ class TestServiceProvider(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_01_create_nw_off_disabled(self): """Test create network with network offering disabled """ - tags = ["advancedns"] # Validate the following # 1. Configure Netscaler for load balancing. @@ -2660,10 +2660,10 @@ class TestServiceProvider(cloudstackTestCase): ) return + @attr(tags = ["advancedns"]) def test_02_create_nw_sp_disabled(self): """Test create network when service provider is disabled """ - tags = ["advancedns"] # Validate the following # 1. Configure Netscaler for load balancing. @@ -2693,10 +2693,10 @@ class TestServiceProvider(cloudstackTestCase): ) return + @attr(tags = ["advancedns"]) def test_03_create_lb_sp_disabled(self): """Test create LB rules when service provider is disabled """ - tags = ["advancedns"] # Validate the following # 1. Configure Netscaler for load balancing. @@ -2930,10 +2930,10 @@ class TestDeleteNetscaler(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_delete_netscaler_with_lb(self): """Test delete Netscaler when active LB rules are present """ - tags = ["advancedns"] # Validate the following # 1. Configure Netscaler for load balancing. diff --git a/test/integration/component/test_netscaler_lb.py b/test/integration/component/test_netscaler_lb.py index 716657ed358..3e3753f5a6d 100644 --- a/test/integration/component/test_netscaler_lb.py +++ b/test/integration/component/test_netscaler_lb.py @@ -221,11 +221,11 @@ class TestLbSourceNat(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_add_lb_on_source_nat(self): """Test Create LB rule for sourceNat IP address """ - tags = ["advancedns"] # Validate the following # 1. Deploy the first VM using a network from the above created @@ -430,11 +430,11 @@ class TestLbOnIpWithPf(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_lb_on_ip_with_pf(self): """Test Create LB rule for sourceNat IP address """ - tags = ["advancedns"] # Validate the following # 1. Deploy the first VM using a network from the above created @@ -641,11 +641,11 @@ class TestPfOnIpWithLb(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_pf_on_ip_with_lb(self): """Test Create a port forwarding rule on an Ip address that already has a LB rule. """ - tags = ["advancedns"] # Validate the following # 1. Deploy the first VM using a network from the above created @@ -853,11 +853,11 @@ class TestLbOnNonSourceNat(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_lb_on_non_source_nat(self): """Test Create LB rule for non-sourceNat IP address """ - tags = ["advancedns"] # Validate the following # 1. Deploy the first VM using a network from the above created @@ -1068,11 +1068,11 @@ class TestAddMultipleVmsLb(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_add_multiple_vms_lb(self): """Test Add multiple Vms to an existing LB rule. """ - tags = ["advancedns"] # Validate the following # 1. Deploy the first VM using a network from the above created @@ -1346,11 +1346,11 @@ class TestMultipleLbRules(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_multiple_lb_publicip(self): """Test Create multiple LB rules using different public Ips acquired """ - tags = ["advancedns"] # Validate the following # 1. Deploy the first VM using a network from the above created @@ -1662,11 +1662,11 @@ class TestMultipleLbRulesSameIp(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_multiple_lb_same_publicip(self): """Test Create multiple LB rules using same public Ips on diff ports """ - tags = ["advancedns"] # Validate the following # 1. Deploy the first VM using a network from the above created @@ -2019,11 +2019,11 @@ class TestLoadBalancingRule(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_01_edit_name_lb_rule(self): """Test edit name of LB rule """ - tags = ["advancedns"] # Validate the following # 1. Create an Lb rule for couple of Vms . @@ -2053,11 +2053,11 @@ class TestLoadBalancingRule(cloudstackTestCase): ) return + @attr(tags = ["advancedns"]) def test_02_edit_lb_ports(self): """Test edit public port of LB rule """ - tags = ["advancedns"] # Validate the following # 1. Create an Lb rule for couple of Vms . @@ -2075,11 +2075,11 @@ class TestLoadBalancingRule(cloudstackTestCase): return + @attr(tags = ["advancedns"]) def test_03_delete_lb_rule(self): """Test delete LB rule """ - tags = ["advancedns"] # Validate the following # 1. Delete existing load balancing rule @@ -2243,10 +2243,10 @@ class TestDeleteCreateLBRule(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_01_create_with_same_public_port(self): """Test create LB rule with same public port after deleting rule""" - tags = ["advancedns"] # Validate the following # 1. Delete existing rule and create exactly same rule with different @@ -2404,10 +2404,10 @@ class TestVmWithLb(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_01_delete_public_ip(self): """Test delete one public Ip with LB rules""" - tags = ["advancedns"] # Validate the following # 1. Associate 2 public Ips and create load balancing rules in it @@ -2473,10 +2473,10 @@ class TestVmWithLb(cloudstackTestCase): (self.services["netscaler"]["ipaddress"], e)) return + @attr(tags = ["advancedns"]) def test_02_stop_user_vm(self): """Test stop user VM with LB""" - tags = ["advancedns"] # Validate the following # 1. Create 2 instances and add these two for load balancing @@ -2553,10 +2553,10 @@ class TestVmWithLb(cloudstackTestCase): (self.services["netscaler"]["ipaddress"], e)) return + @attr(tags = ["advancedns"]) def test_03_start_user_vm(self): """Test start user VM with LB""" - tags = ["advancedns"] # Validate the following # 1. Create 2 instances and add these two for load balancing @@ -2624,10 +2624,10 @@ class TestVmWithLb(cloudstackTestCase): (self.services["netscaler"]["ipaddress"], e)) return + @attr(tags = ["advancedns"]) def test_04_migrate_user_vm(self): """Test migrate user VM with LB""" - tags = ["advancedns"] # Validate the following # 1. Create 2 instances and add these two for load balancing @@ -2737,10 +2737,10 @@ class TestVmWithLb(cloudstackTestCase): (self.services["netscaler"]["ipaddress"], e)) return + @attr(tags = ["advancedns"]) def test_05_reboot_user_vm(self): """Test reboot user VM with LB""" - tags = ["advancedns"] # Validate the following # 1. Create 2 instances and add these two for load balancing @@ -2807,10 +2807,10 @@ class TestVmWithLb(cloudstackTestCase): (self.services["netscaler"]["ipaddress"], e)) return + @attr(tags = ["advancedns"]) def test_06_destroy_user_vm(self): """Test destroy user VM with LB""" - tags = ["advancedns"] # Validate the following # 1. Create 2 instances and add these two for load balancing @@ -2890,10 +2890,10 @@ class TestVmWithLb(cloudstackTestCase): (self.services["netscaler"]["ipaddress"], e)) return + @attr(tags = ["advancedns"]) def test_07_delete_all_public_ip(self): """Test delete all public Ip with LB rules""" - tags = ["advancedns"] # Validate the following # 1. Associate 2 public Ips and create load balancing rules in it diff --git a/test/integration/component/test_netscaler_lb_algo.py b/test/integration/component/test_netscaler_lb_algo.py index 1cd78dc61bc..24ab66c3e9f 100644 --- a/test/integration/component/test_netscaler_lb_algo.py +++ b/test/integration/component/test_netscaler_lb_algo.py @@ -188,10 +188,10 @@ class TestLbWithRoundRobin(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_lb_with_round_robin(self): """Test Create LB rule with round robin algorithm """ - tags = ["advancedns"] # Validate the following # 1. Deploy the first VM using a network from the above created @@ -401,10 +401,10 @@ class TestLbWithLeastConn(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_lb_with_least_conn(self): """Test Create LB rule with least connection algorithm """ - tags = ["advancedns"] # Validate the following # 1. Deploy the first VM using a network from the above created @@ -620,10 +620,10 @@ class TestLbWithSourceIp(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_lb_with_source_ip(self): """Test Create LB rule with source Ip algorithm """ - tags = ["advancedns"] # Validate the following # 1. Deploy the first VM using a network from the above created @@ -857,10 +857,10 @@ class TestLbAlgoRrLc(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_lb_round_robin_to_least_conn(self): """Test edit LB rule from round robin to least connection algo """ - tags = ["advancedns"] # Validate the following # 1. Deploy the first VM using a network from the above created @@ -1069,10 +1069,10 @@ class TestLbAlgoLcRr(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_lb_least_conn_to_round_robin(self): """Test edit LB rule from least conn to round robin algo """ - tags = ["advancedns"] # Validate the following # 1. Deploy the first VM using a network from the above created @@ -1279,10 +1279,10 @@ class TestLbAlgoRrSb(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_lb_round_robin_to_source(self): """Test edit LB rule from round robin to source algo """ - tags = ["advancedns"] # Validate the following # 1. Deploy the first VM using a network from the above created @@ -1491,10 +1491,10 @@ class TestLbAlgoSbRr(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_lb_source_to_round_robin(self): """Test edit LB rule from source to round robin algo """ - tags = ["advancedns"] # Validate the following # 1. Deploy the first VM using a network from the above created @@ -1706,10 +1706,10 @@ class TestLbAlgoSbLc(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_lb_source_to_least_conn(self): """Test edit LB rule from source to least conn algo """ - tags = ["advancedns"] # Validate the following # 1. Deploy the first VM using a network from the above created @@ -1919,10 +1919,10 @@ class TestLbAlgoLcSb(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_lb_leastconn_to_source(self): """Test edit LB rule from round robin to source algo """ - tags = ["advancedns"] # Validate the following # 1. Deploy the first VM using a network from the above created diff --git a/test/integration/component/test_netscaler_lb_sticky.py b/test/integration/component/test_netscaler_lb_sticky.py index 8a420ae838e..e3f02da3bbc 100644 --- a/test/integration/component/test_netscaler_lb_sticky.py +++ b/test/integration/component/test_netscaler_lb_sticky.py @@ -215,10 +215,10 @@ class TestLbStickyPolicy(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_01_source_based_roundrobin(self): """Test Create a "SourceBased" stick policy for a Lb rule with "RoundRobin" algorithm """ - tags = ["advancedns"] # Validate the following # 1. Configure Netscaler for load balancing. @@ -303,10 +303,10 @@ class TestLbStickyPolicy(cloudstackTestCase): (self.services["netscaler"]["ipaddress"], e)) return + @attr(tags = ["advancedns"]) def test_02_source_based_source_algo(self): """Test Create a "SourceBased" stick policy for a Lb rule with "Source" algorithm """ - tags = ["advancedns"] # Validate the following # 1. Configure Netscaler for load balancing. @@ -392,10 +392,10 @@ class TestLbStickyPolicy(cloudstackTestCase): (self.services["netscaler"]["ipaddress"], e)) return + @attr(tags = ["advancedns"]) def test_03_source_based_leastconn(self): """Test Create a "SourceBased" stick policy for a Lb rule with leastconn algo """ - tags = ["advancedns"] # Validate the following # 1. Configure Netscaler for load balancing. @@ -481,10 +481,10 @@ class TestLbStickyPolicy(cloudstackTestCase): (self.services["netscaler"]["ipaddress"], e)) return + @attr(tags = ["advancedns"]) def test_04_lbcookie_based_roundrobin(self): """Test Create a "LBCookie" stick policy for a Lb rule with roundrobin algo """ - tags = ["advancedns"] # Validate the following # 1. Configure Netscaler for load balancing. @@ -572,10 +572,10 @@ class TestLbStickyPolicy(cloudstackTestCase): (self.services["netscaler"]["ipaddress"], e)) return + @attr(tags = ["advancedns"]) def test_05_lbcookie_source_algo(self): """Test Create a "LBCookie" stick policy for a Lb rule with "Source" algorithm """ - tags = ["advancedns"] # Validate the following # 1. Configure Netscaler for load balancing. @@ -663,10 +663,10 @@ class TestLbStickyPolicy(cloudstackTestCase): (self.services["netscaler"]["ipaddress"], e)) return + @attr(tags = ["advancedns"]) def test_06_lbcookie_leastconn(self): """Test Create a "LBCookie" stick policy for a Lb rule with leastconn algo """ - tags = ["advancedns"] # Validate the following # 1. Configure Netscaler for load balancing. @@ -754,10 +754,10 @@ class TestLbStickyPolicy(cloudstackTestCase): (self.services["netscaler"]["ipaddress"], e)) return + @attr(tags = ["advancedns"]) def test_07_appcookie_based_roundrobin(self): """Test Create a "AppCookie" stick policy for a Lb rule with roundrobin algo """ - tags = ["advancedns"] # Validate the following # 1. Configure Netscaler for load balancing. @@ -845,10 +845,10 @@ class TestLbStickyPolicy(cloudstackTestCase): (self.services["netscaler"]["ipaddress"], e)) return + @attr(tags = ["advancedns"]) def test_08_appcookie_source_algo(self): """Test Create a "AppCookie" stick policy for a Lb rule with "Source" """ - tags = ["advancedns"] # Validate the following # 1. Configure Netscaler for load balancing. @@ -936,10 +936,10 @@ class TestLbStickyPolicy(cloudstackTestCase): (self.services["netscaler"]["ipaddress"], e)) return + @attr(tags = ["advancedns"]) def test_09_appcookie_leastconn(self): """Test Create a "AppCookie" stick policy for a Lb rule with leastconn """ - tags = ["advancedns"] # Validate the following # 1. Configure Netscaler for load balancing. diff --git a/test/integration/component/test_netscaler_nw_off.py b/test/integration/component/test_netscaler_nw_off.py index b70b3cc8241..d57b4bb753c 100644 --- a/test/integration/component/test_netscaler_nw_off.py +++ b/test/integration/component/test_netscaler_nw_off.py @@ -201,11 +201,11 @@ class TestAddMultipleNetScaler(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_add_netscaler_device(self): """Test add netscaler device """ - tags = ["advancedns"] # Validate the following # 1. Add multiple instances of netscaler @@ -359,11 +359,11 @@ class TestAddMultipleNSDiffZone(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_add_mul_netscaler_diff_zone(self): """Test add netscaler devices in different zones """ - tags = ["advancedns"] # Validate the following # 1. Add multiple instances of Netscaler in different zones @@ -647,11 +647,11 @@ class TestNetScalerSharedMode(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_01_netscaler_shared_mode(self): """Test netscaler device in shared mode """ - tags = ["advancedns"] # Validate the following # 1. Add Netscaler device in shared mode with capacity 3 @@ -802,11 +802,11 @@ class TestNetScalerSharedMode(cloudstackTestCase): self.debug("Deploy VM failed as Netscaler device capacity is full!") return + @attr(tags = ["advancedns"]) def test_02_multiple_netscaler_capacilty(self): """Test multiple netscaler devices with limited capacity """ - tags = ["advancedns"] # Validate the following # 1. Add another netscaler device and spawn a new VM again @@ -904,11 +904,11 @@ class TestNetScalerSharedMode(cloudstackTestCase): ) return + @attr(tags = ["advancedns"]) def test_03_multiple_netscaler_full_capacilty(self): """Test netscaler device with full capacity """ - tags = ["advancedns"] # Validate the following # 1. Spawn multiple instances for utilizing full capacity of Netscaler @@ -989,11 +989,11 @@ class TestNetScalerSharedMode(cloudstackTestCase): self.debug("Deploy VM failed as Netscaler device capacity is full!") return + @attr(tags = ["advancedns"]) def test_04_delete_account_after_capacity_full(self): """Test delete and add resouces after netscaler device capacity is full """ - tags = ["advancedns"] # Validate the following # 1. Delete one of the account. Wait till Network.gc.wait & @@ -1174,11 +1174,11 @@ class TestNwOffDedicatedNetscaler(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_nw_off_dedicated_mode(self): """Test network offering in dedicated mode device """ - tags = ["advancedns"] # Validate the following # 1. Add Netscaler device in shared mode @@ -1368,11 +1368,11 @@ class TestNwOffNetscaler(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_ns_shared_nw_dedicated(self): """Test netscaler device in shared mode with network offering in dedicated mode """ - tags = ["advancedns"] # Validate the following # 1. Add Netscaler device in shared mode @@ -1679,10 +1679,10 @@ class TestNwOffSToDUpgrade(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_shared_to_dedicated_upgrade(self): """Test upgrade from shared LB isolation to dedicated LB isolation""" - tags = ["advancedns"] # Validate the following # 1. Create a dedicated and shared network offering @@ -2096,10 +2096,10 @@ class TestNwOffDToSUpgrade(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_shared_to_dedicated_upgrade(self): """Test upgrade from shared LB isolation to dedicated LB isolation""" - tags = ["advancedns"] # Validate the following # 1. Create a dedicated and shared network offering diff --git a/test/integration/component/test_network_offering.py b/test/integration/component/test_network_offering.py index 010dbf2404b..b351de355af 100644 --- a/test/integration/component/test_network_offering.py +++ b/test/integration/component/test_network_offering.py @@ -206,11 +206,11 @@ class TestNOVirtualRouter(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced"]) def test_01_network_off_without_conserve_mode(self): """Test Network offering with Conserve mode off and VR - All services """ - tags = ["advanced"] # Validate the following # 1. Create a Network from the above network offering and deploy a VM. @@ -451,11 +451,11 @@ class TestNOVirtualRouter(cloudstackTestCase): ) return + @attr(tags = ["advanced"]) def test_02_network_off_with_conserve_mode(self): """Test Network offering with Conserve mode ON and VR - All services """ - tags = ["advanced"] # Validate the following # 1. Create a Network from the above network offering and deploy a VM. @@ -784,11 +784,11 @@ class TestNOWithNetscaler(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_01_network_off_without_conserve_mode(self): """Test Nw off with Conserve mode off, VR-All services, LB-netscaler """ - tags = ["advancedns"] # Validate the following # 1. Create a Network from the above network offering and deploy a VM. @@ -1053,11 +1053,11 @@ class TestNOWithNetscaler(cloudstackTestCase): ) return + @attr(tags = ["advancedns"]) def test_02_network_off_with_conserve_mode_netscaler(self): """Test NW off with Conserve mode ON, LB-Netscaler and VR-All services """ - tags = ["advancedns"] # Validate the following # 1. Create a Network from the above network offering and deploy a VM. @@ -1428,11 +1428,11 @@ class TestNetworkUpgrade(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advancedns"]) def test_01_nwupgrade_netscaler_conserve_on(self): """Test Nw upgrade to netscaler lb service and conserve mode ON """ - tags = ["advancedns"] # Validate the following # 1. Upgrade a network with VR and conserve mode ON TO @@ -1627,11 +1627,11 @@ class TestNetworkUpgrade(cloudstackTestCase): ) return + @attr(tags = ["advancedns"]) def test_02_nwupgrade_netscaler_conserve_off(self): """Test Nw upgrade to netscaler lb service and conserve mode OFF """ - tags = ["advancedns"] # Validate the following # 1. Upgrade a network with VR and conserve mode ON TO diff --git a/test/integration/component/test_project_configs.py b/test/integration/component/test_project_configs.py index d153bf3d616..9272250abfe 100644 --- a/test/integration/component/test_project_configs.py +++ b/test/integration/component/test_project_configs.py @@ -170,10 +170,10 @@ class TestUserProjectCreation(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) def test_admin_project_creation(self): """Test create project as a domain admin and domain user """ - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following # 1. Check if 'allow.user.create.projects' configuration is true # 2. Create a Project as domain admin @@ -318,11 +318,11 @@ class TestProjectCreationNegative(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) @unittest.skip("Known bug-able to create project as a domain user") def test_user_project_creation(self): """Test create project as a domain admin and domain user """ - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following # 1. Check if 'allow.user.create.projects' configuration is false # 2. Create a Project as domain admin. Project creation should be @@ -443,10 +443,10 @@ class TestProjectInviteRequired(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) def test_add_user_to_project(self): """Add user to project when 'project.invite.required' is false""" - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following: # 1. Create a Project diff --git a/test/integration/component/test_project_limits.py b/test/integration/component/test_project_limits.py index 70348ee6402..917595e7166 100644 --- a/test/integration/component/test_project_limits.py +++ b/test/integration/component/test_project_limits.py @@ -152,10 +152,10 @@ class TestProjectLimits(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) def test_01_project_limits(self): """ Test project limits """ - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following # 1. Create a Project. Verify once projects are created, they inherit # a default set of resource limits as configured by the Cloud Stack @@ -299,11 +299,11 @@ class TestProjectLimits(cloudstackTestCase): ) return + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) @unittest.skip("No provision for updating resource limits from account through API") def test_02_project_limits_normal_user(self): """ Test project limits """ - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following # 1. Create a Project # 2. Reduce the projects limits as a domain admin. Verify resource @@ -523,10 +523,10 @@ class TestResourceLimitsProject(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) def test_03_vm_per_project(self): """Test VM limit per project """ - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following # 1. Set max VM per project to 2 # 2. Create account and start 2 VMs. Verify VM state is Up and Running diff --git a/test/integration/component/test_project_resources.py b/test/integration/component/test_project_resources.py index cd2961661aa..835b021a154 100644 --- a/test/integration/component/test_project_resources.py +++ b/test/integration/component/test_project_resources.py @@ -203,10 +203,10 @@ class TestOfferings(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) def test_01_service_offerings(self): """ Test service offerings in a project """ - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following # 1. Create a project. # 2. List service offerings for the project. All SO available in the @@ -245,10 +245,10 @@ class TestOfferings(cloudstackTestCase): return + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) def test_02_project_disk_offerings(self): """ Test project disk offerings """ - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following # 1. Create a project. # 2. List service offerings for the project. All disk offerings @@ -377,10 +377,10 @@ class TestNetwork(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "advancedns"]) def test_03_network_create(self): """ Test create network in project """ - tags = ["advanced", "advancedns"] # Validate the following # 1. Create a project. # 2. Add virtual/direct network resource to the project. User shared @@ -581,10 +581,10 @@ class TestTemplates(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) def test_04_public_template_use_in_project(self): """Test Templates creation in projects """ - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following # 1. Create a project # 2. Verify Public templates can be used without any restriction @@ -640,10 +640,10 @@ class TestTemplates(cloudstackTestCase): ) return + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) def test_05_use_private_template_in_project(self): """Test use of private template in a project """ - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following # 1. Create a project # 2. Verify that in order to use somebody’s Private template for vm @@ -806,10 +806,10 @@ class TestSnapshots(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) def test_06_create_snapshots_in_project(self): """Test create snapshots in project """ - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following # 1. Create a project # 2. Add some snapshots to the project @@ -959,10 +959,10 @@ class TestPublicIpAddress(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "advancedns"]) def test_07_associate_public_ip(self): """Test associate public IP within the project """ - tags = ["advanced", "eip", "advancedns"] # Validate the following # 1. Create a project # 2. Add some public Ips to the project @@ -1235,10 +1235,10 @@ class TestSecurityGroup(cloudstackTestCase): return + @attr(tags = ["sg", "eip"]) def test_08_security_group(self): """Test security groups in project """ - tags = ["sg", "eip"] # Validate the following: # 1. Create a project # 2. Assign some security groups to that project diff --git a/test/integration/component/test_project_usage.py b/test/integration/component/test_project_usage.py index 2b8a94a9935..f1f70ccf562 100644 --- a/test/integration/component/test_project_usage.py +++ b/test/integration/component/test_project_usage.py @@ -188,10 +188,10 @@ class TestVmUsage(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) def test_01_vm_usage(self): """Test Create/Destroy VM and verify usage calculation """ - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following # 1. Create a VM. Verify usage_events table contains VM .create, # VM.start , Network.offering.assign , Volume.create events @@ -399,10 +399,10 @@ class TestPublicIPUsage(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "eip", "advancedns"]) def test_01_public_ip_usage(self): """Test Assign new IP and verify usage calculation """ - tags = ["advanced", "eip", "advancedns"] # Validate the following # 1. Acquire a IP for the network of this account. Verify usage_event # table has Acquire IP event for the IP for this account @@ -557,10 +557,10 @@ class TestVolumeUsage(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) def test_01_volume_usage(self): """Test Create/delete a volume and verify correct usage is recorded """ - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following # 1. Volume.create event for both root and data disk is there for the # created account in cloud.usage_event table @@ -748,11 +748,11 @@ class TestTemplateUsage(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) def test_01_template_usage(self): """Test Upload/ delete a template and verify correct usage is generated for the template uploaded """ - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following # 1. Create a account # 2. Upload a template from this account. template.create event is @@ -900,10 +900,10 @@ class TestISOUsage(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) def test_01_ISO_usage(self): """Test Create/Delete a ISO and verify its usage is generated correctly """ - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following # 1. Create a account # 2. Upload a ISO from this account. ISO.create event is recorded in @@ -1072,10 +1072,10 @@ class TestLBRuleUsage(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "eip", "advancedns"]) def test_01_lb_usage(self): """Test Create/Delete a LB rule and verify correct usage is recorded """ - tags = ["advanced", "eip", "advancedns"] # Validate the following # 1. Acquire a IP for this account. lb.rule.create event is registered # for this account in cloud.usage_event table @@ -1238,11 +1238,11 @@ class TestSnapshotUsage(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) def test_01_snapshot_usage(self): """Test Create/Delete a manual snap shot and verify correct usage is recorded """ - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following # 1. Create snapshot of the root disk for this account.Snapshot.create # event is there for the created account in cloud.usage_event table @@ -1430,10 +1430,10 @@ class TestNatRuleUsage(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "advancedns"]) def test_01_nat_usage(self): """Test Create/Delete a PF rule and verify correct usage is recorded """ - tags = ["advanced", "advancedns"] # Validate the following # 1. Acquire a IP for this account # 2. Create a PF rule on the IP associated with this account. @@ -1613,10 +1613,10 @@ class TestVpnUsage(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "advancedns"]) def test_01_vpn_usage(self): """Test Create/Delete a VPN and verify correct usage is recorded """ - tags = ["advanced", "advancedns"] # Validate the following # 1. Enable VPN for this IP. vpn.add.user event is registered for this # account in cloud.usage_event table diff --git a/test/integration/component/test_projects.py b/test/integration/component/test_projects.py index e0e1b5f0bbf..5eee677c432 100644 --- a/test/integration/component/test_projects.py +++ b/test/integration/component/test_projects.py @@ -164,11 +164,11 @@ class TestMultipleProjectCreation(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) def test_01_create_multiple_projects_by_account(self): """ Verify an account can own multiple projects and can belong to multiple projects """ - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following # 1. Create multiple project. Verify at step 1 An account is allowed # to create multiple projects @@ -380,10 +380,10 @@ class TestCrossDomainAccountAdd(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) def test_02_cross_domain_account_add(self): """ Verify No cross domain projects """ - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following # 1. Create a project in a domain. # 2. Add different domain account to the project. Add account should @@ -500,10 +500,10 @@ class TestDeleteAccountWithProject(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) def test_03_delete_account_with_project(self): """ Test As long as the project exists, its owner can't be removed """ - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following # 1. Create a project. # 2. Delete account who is owner of the project. Delete account should @@ -614,11 +614,11 @@ class TestDeleteDomainWithProject(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) def test_04_delete_domain_with_project(self): """ Test Verify delete domain with cleanup=true should delete projects belonging to the domain """ - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following # 1. Create a project in a domain # 2. Delete domain forcefully. Verify that project is also deleted as @@ -759,11 +759,11 @@ class TestProjectOwners(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) def test_05_user_project_owner_promotion(self): """ Test Verify a project user can be later promoted to become a owner """ - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following # 1. Create a project. # 2. Add account to the project. Edit account to make it a project @@ -901,10 +901,10 @@ class TestProjectOwners(cloudstackTestCase): ) return + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) def test_06_max_one_project_owner(self): """ Test Verify there can only be one owner of a project at a time """ - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following # 1. Create a project. # 2. Add account to the project. Edit account to make it a project @@ -1191,11 +1191,11 @@ class TestProjectResources(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) def test_07_project_resources_account_delete(self): """ Test Verify after an account is removed from the project, all his resources stay with the project. """ - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following # 1. Create a project. # 2. Add some accounts to project. Add resources to the project @@ -1307,10 +1307,10 @@ class TestProjectResources(cloudstackTestCase): ) return + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) def test_08_cleanup_after_project_delete(self): """ Test accounts are unassigned from project after project deletion """ - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following # 1. Create a project. # 2. Add some accounts to project. Add resources to the project @@ -1521,11 +1521,11 @@ class TestProjectSuspendActivate(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) def test_09_project_suspend(self): """ Test Verify after an account is removed from the project, all his resources stay with the project. """ - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following # 1. Create a project. # 2. Add some accounts to project. Add resources to the project @@ -1658,10 +1658,10 @@ class TestProjectSuspendActivate(cloudstackTestCase): ) return + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) def test_10_project_activation(self): """ Test project activation after suspension """ - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following # 1. Activate the project # 2. Verify project is activated and we are able to add resources diff --git a/test/integration/component/test_resource_limits.py b/test/integration/component/test_resource_limits.py index c8d0df925d0..aad83292bfb 100644 --- a/test/integration/component/test_resource_limits.py +++ b/test/integration/component/test_resource_limits.py @@ -149,10 +149,10 @@ class TestResourceLimitsAccount(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "advancedns"]) def test_01_vm_per_account(self): """Test VM limit per account """ - tags = ["advanced", "advancedns"] # Validate the following # 1. Set user_vm=1 limit for account 1. @@ -242,10 +242,10 @@ class TestResourceLimitsAccount(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns"]) def test_02_publicip_per_account(self): """Test Public IP limit per account """ - tags = ["advanced", "advancedns"] # Validate the following # 1. Set Public_IP= 2 limit for account 1. @@ -385,10 +385,10 @@ class TestResourceLimitsAccount(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns"]) def test_03_snapshots_per_account(self): """Test Snapshot limit per account """ - tags = ["advanced", "advancedns"] # Validate the following # 1. Set snapshot= 2 limit for account 1. @@ -541,10 +541,10 @@ class TestResourceLimitsAccount(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns"]) def test_04_volumes_per_account(self): """Test Volumes limit per account """ - tags = ["advanced", "advancedns"] # Validate the following # 1. Set volumes=2 limit for account 1. @@ -683,10 +683,10 @@ class TestResourceLimitsAccount(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns"]) def test_05_templates_per_account(self): """Test Templates limit per account """ - tags = ["advanced", "advancedns"] # Validate the following # 1. Set templates=1 limit for account 1. @@ -913,10 +913,10 @@ class TestResourceLimitsDomain(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "advancedns"]) def test_01_vm_per_domain(self): """Test VM limit per domain """ - tags = ["advanced", "advancedns"] # Validate the following # 1. Set max VM per domain to 2 @@ -979,10 +979,10 @@ class TestResourceLimitsDomain(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns"]) def test_01_publicip_per_domain(self): """Test Public IP limit per domain """ - tags = ["advanced", "advancedns"] # Validate the following # 1. set max no of IPs per domain to 2. @@ -1049,10 +1049,10 @@ class TestResourceLimitsDomain(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns"]) def test_03_snapshots_per_domain(self): """Test Snapshot limit per domain """ - tags = ["advanced", "advancedns"] # Validate the following # 1. set max no of snapshots per domain to 1. @@ -1132,10 +1132,10 @@ class TestResourceLimitsDomain(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns"]) def test_04_volumes_per_domain(self): """Test Volumes limit per domain """ - tags = ["advanced", "advancedns"] # Validate the following # 1. set max no of volume per domain to 1. @@ -1185,10 +1185,10 @@ class TestResourceLimitsDomain(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns"]) def test_05_templates_per_domain(self): """Test Templates limit per domain """ - tags = ["advanced", "advancedns"] # Validate the following # 1. set max no of templates per domain to 2. @@ -1332,9 +1332,9 @@ class TestResources(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "advancedns"]) def test_01_zones(self): """Check the status of zones""" - tags = ["advanced", "advancedns"] # Validate the following # 1. List zones @@ -1358,9 +1358,9 @@ class TestResources(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns"] def test_02_pods(self): """Check the status of pods""" - tags = ["advanced", "advancedns"] # Validate the following # 1. List pods @@ -1384,9 +1384,9 @@ class TestResources(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns"]) def test_03_clusters(self): """Check the status of clusters""" - tags = ["advanced", "advancedns"] # Validate the following # 1. List clusters @@ -1410,9 +1410,9 @@ class TestResources(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns"]) def test_04_hosts(self): """Check the status of hosts""" - tags = ["advanced", "advancedns"] # Validate the following # 1. List hosts with type=Routing @@ -1437,9 +1437,9 @@ class TestResources(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns"]) def test_05_storage_pools(self): """Check the status of Storage pools""" - tags = ["advanced", "advancedns"] # Validate the following # 1. List storage pools for the zone @@ -1463,9 +1463,9 @@ class TestResources(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns"]) def test_06_secondary_storage(self): """Check the status of secondary storage""" - tags = ["advanced", "advancedns"] # Validate the following # 1. List secondary storage diff --git a/test/integration/component/test_routers.py b/test/integration/component/test_routers.py index 73c24ed3959..1805207b14b 100644 --- a/test/integration/component/test_routers.py +++ b/test/integration/component/test_routers.py @@ -164,10 +164,10 @@ class TestRouterServices(cloudstackTestCase): self._cleanup = [] return + @attr(tags = ["advanced"]) def test_01_AdvancedZoneRouterServices(self): """Test advanced zone router services """ - tags = ["advanced"] # Validate the following: # 1. Verify that list of services provided by this network are running # a. DNS @@ -310,10 +310,10 @@ class TestRouterServices(cloudstackTestCase): ) return + @attr(tags = ["advanced"]) def test_02_NetworkGarbageCollection(self): """Test network garbage collection """ - tags = ["advanced"] # Validate the following # 1. wait for router to start and guest network to be created # a.listRouters account=user, domainid=1 (router state=Running) @@ -468,10 +468,10 @@ class TestRouterServices(cloudstackTestCase): self._cleanup.append(self.vm_2) return + @attr(tags = ["advanced"]) def test_03_RouterStartOnVmDeploy(self): """Test router start on VM deploy """ - tags = ["advanced"] # Validate the following # 1. deployVirtualMachine in the account # 2. listVirtualMachines account=user, domainid=1 @@ -643,10 +643,10 @@ class TestRouterStopCreatePF(cloudstackTestCase): self._cleanup = [] return + @attr(tags = ["advanced"]) def test_01_RouterStopCreatePF(self): """Test router stop create port forwarding """ - tags = ["advanced"] # validate the following # 1. wait for router to start, guest network to be implemented and # VM to report Running @@ -853,10 +853,10 @@ class TestRouterStopCreateLB(cloudstackTestCase): self._cleanup = [] return + @attr(tags = ["advanced"]) def test_01_RouterStopCreateLB(self): """Test router stop create Load balancing """ - tags = ["advanced"] # validate the following # 1. listLoadBalancerRules (publicipid=ipaddressid of source NAT) # 2. rule should be for port 2222 as applied and @@ -1063,10 +1063,10 @@ class TestRouterStopCreateFW(cloudstackTestCase): self._cleanup = [] return + @attr(tags = ["advanced"]) def test_01_RouterStopCreateFW(self): """Test router stop create Firewall rule """ - tags = ["advanced"] # validate the following # 1. 1. listFirewallRules (filter by ipaddressid of sourcenat) # 2. rule should be for ports 1-600 and in state=Active diff --git a/test/integration/component/test_security_groups.py b/test/integration/component/test_security_groups.py index 0b1072b03a6..df4d41b4f01 100644 --- a/test/integration/component/test_security_groups.py +++ b/test/integration/component/test_security_groups.py @@ -162,11 +162,11 @@ class TestDefaultSecurityGroup(cloudstackTestCase): return + @attr(tags = ["sg", "eip"]) def test_01_deployVM_InDefaultSecurityGroup(self): """Test deploy VM in default security group """ - tags = ["sg", "eip"] # Validate the following: # 1. deploy Virtual machine using admin user @@ -241,11 +241,11 @@ class TestDefaultSecurityGroup(cloudstackTestCase): ) return + @attr(tags = ["sg", "eip"]) def test_02_listSecurityGroups(self): """Test list security groups for admin account """ - tags = ["sg", "eip"] # Validate the following: # 1. listSecurityGroups in admin account @@ -276,11 +276,11 @@ class TestDefaultSecurityGroup(cloudstackTestCase): ) return + @attr(tags = ["sg", "eip"]) def test_03_accessInDefaultSecurityGroup(self): """Test access in default security group """ - tags = ["sg", "eip"] # Validate the following: # 1. deploy Virtual machine using admin user @@ -433,11 +433,11 @@ class TestAuthorizeIngressRule(cloudstackTestCase): return + @attr(tags = ["sg", "eip"]) def test_01_authorizeIngressRule(self): """Test authorize ingress rule """ - tags = ["sg", "eip"] # Validate the following: #1. Create Security group for the account. @@ -569,11 +569,11 @@ class TestRevokeIngressRule(cloudstackTestCase): return + @attr(tags = ["sg", "eip"]) def test_01_revokeIngressRule(self): """Test revoke ingress rule """ - tags = ["sg", "eip"] # Validate the following: #1. Create Security group for the account. @@ -736,11 +736,11 @@ class TestDhcpOnlyRouter(cloudstackTestCase): return + @attr(tags = ["sg", "eip", "basic"]) def test_01_dhcpOnlyRouter(self): """Test router services for user account """ - tags = ["sg", "eip", "basic"] # Validate the following #1. List routers for any user account @@ -866,10 +866,10 @@ class TestdeployVMWithUserData(cloudstackTestCase): return + @attr(tags = ["sg", "eip"]) def test_01_deployVMWithUserData(self): """Test Deploy VM with User data""" - tags = ["sg", "eip"] # Validate the following # 1. CreateAccount of type user @@ -1042,10 +1042,10 @@ class TestDeleteSecurityGroup(cloudstackTestCase): return + @attr(tags = ["sg", "eip"]) def test_01_delete_security_grp_running_vm(self): """Test delete security group with running VM""" - tags = ["sg", "eip"] # Validate the following # 1. createsecuritygroup (ssh-incoming) for this account @@ -1126,10 +1126,10 @@ class TestDeleteSecurityGroup(cloudstackTestCase): ) return + @attr(tags = ["sg", "eip"]) def test_02_delete_security_grp_withoout_running_vm(self): """Test delete security group without running VM""" - tags = ["sg", "eip"] # Validate the following # 1. createsecuritygroup (ssh-incoming) for this account @@ -1288,10 +1288,10 @@ class TestIngressRule(cloudstackTestCase): return + @attr(tags = ["sg", "eip"]) def test_01_authorizeIngressRule_AfterDeployVM(self): """Test delete security group with running VM""" - tags = ["sg", "eip"] # Validate the following # 1. createsecuritygroup (ssh-incoming, 22via22) for this account @@ -1400,10 +1400,10 @@ class TestIngressRule(cloudstackTestCase): % (ingress_rule_2["id"], e)) return + @attr(tags = ["sg", "eip"]) def test_02_revokeIngressRule_AfterDeployVM(self): """Test Revoke ingress rule after deploy VM""" - tags = ["sg", "eip"] # Validate the following # 1. createsecuritygroup (ssh-incoming, 22via22) for this account @@ -1554,10 +1554,10 @@ class TestIngressRule(cloudstackTestCase): % (icmp_rule["ruleid"], e)) return + @attr(tags = ["sg", "eip"]) def test_03_stopStartVM_verifyIngressAccess(self): """Test Start/Stop VM and Verify ingress rule""" - tags = ["sg", "eip"] # Validate the following # 1. createsecuritygroup (ssh-incoming, 22via22) for this account diff --git a/test/integration/component/test_security_keys_encryption.py b/test/integration/component/test_security_keys_encryption.py index 8538dc4b88b..d33c2181ec1 100644 --- a/test/integration/component/test_security_keys_encryption.py +++ b/test/integration/component/test_security_keys_encryption.py @@ -155,10 +155,10 @@ class TestSecurityKeysEncryption(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "basic"]) def test_vm_instance_vnc_password(self): """ Verify vm_instance table's vnc_password column encryption """ - tags = ["advanced", "basic"] #Steps, #Deploy a VM @@ -182,10 +182,10 @@ class TestSecurityKeysEncryption(cloudstackTestCase): ) return + @attr(tags = ["advanced"]) def test_vpn_users_password(self): """ Verify vpn_users table's password column encryption """ - tags = ["advanced"] #Steps, #Deploy a VM @@ -233,6 +233,7 @@ class TestSecurityKeysEncryption(cloudstackTestCase): "Check password in vpn_users table to verify encryption" ) + @attr(tags = ["advanced", "basic"]) def test_user_secret_key(self): """ Verify user table's SECRET key column encryption """ #Steps, @@ -240,7 +241,6 @@ class TestSecurityKeysEncryption(cloudstackTestCase): #Validations, #Verify user table's secret key column is encrypted - tags = ["advanced", "basic"] user_keys = User.registerUserKeys(self.apiclient, self.account.account.user[0].id) qresultset = self.dbclient.execute( @@ -261,10 +261,10 @@ class TestSecurityKeysEncryption(cloudstackTestCase): ) return + @attr(tags = ["advanced", "basic"]) def test_host_password(self): """ Verify host details table's value column encryption where name is password """ - tags = ["advanced", "basic"] #Validations, #Verify host details table's value column is encrypted where name is password @@ -314,10 +314,10 @@ class TestSecurityKeysEncryption(cloudstackTestCase): ) return + @attr(tags = ["advanced", "basic"]) def test_configurations_value_encryption(self): """ verify configuration tables following name records value field are encrypted """ - tags = ["advanced", "basic"] #Steps #verify configuration tables following name records value field are encrypted diff --git a/test/integration/component/test_snapshots.py b/test/integration/component/test_snapshots.py index 8098f860315..95627b6a9cc 100644 --- a/test/integration/component/test_snapshots.py +++ b/test/integration/component/test_snapshots.py @@ -160,10 +160,10 @@ class TestCreateVMsnapshotTemplate(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "advancedns"]) def test_01_createVM_snapshotTemplate(self): """Test create VM, Snapshot and Template """ - tags = ["advanced", "advancedns"] # Validate the following # 1. Deploy VM using default template, small service offering # and small data disk offering. @@ -473,10 +473,10 @@ class TestAccountSnapshotClean(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "advancedns"]) def test_02_accountSnapshotClean(self): """Test snapshot cleanup after account deletion """ - tags = ["advanced", "advancedns"] # Validate the following # 1. listAccounts API should list out the newly created account # 2. listVirtualMachines() command should return the deployed VM. @@ -816,10 +816,10 @@ class TestSnapshotDetachedDisk(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "advancedns"]) def test_03_snapshot_detachedDisk(self): """Test snapshot from detached disk """ - tags = ["advanced", "advancedns"] # Validate the following # 1. login in VM and write some data on data disk(use fdisk to # partition datadisk,fdisk /dev/sdb, and make filesystem using @@ -1095,10 +1095,10 @@ class TestSnapshotLimit(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "advancedns"]) def test_04_snapshot_limit(self): """Test snapshot limit in snapshot policies """ - tags = ["advanced", "advancedns"] # Validate the following # 1. Perform hourly recurring snapshot on the root disk of VM and keep # the maxsnapshots as 1 @@ -1353,10 +1353,10 @@ class TestSnapshotEvents(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "advancedns"]) def test_05_snapshot_events(self): """Test snapshot events """ - tags = ["advanced", "advancedns"] # Validate the following # 1. Perform snapshot on the root disk of this VM and check the events/alerts. # 2. delete the snapshots and check the events/alerts diff --git a/test/integration/component/test_stopped_vm.py b/test/integration/component/test_stopped_vm.py index 8a4c45fa005..c256655ebb5 100644 --- a/test/integration/component/test_stopped_vm.py +++ b/test/integration/component/test_stopped_vm.py @@ -167,10 +167,10 @@ class TestDeployVM(cloudstackTestCase): except Exception as e: self.debug("Warning! Exception in tearDown: %s" % e) + @attr(tags = ["advanced", "eip", "advancedns", "basic", "sg"]) def test_01_deploy_vm_no_startvm(self): """Test Deploy Virtual Machine with no startVM parameter """ - tags = ["advanced", "eip", "advancedns", "basic", "sg"] # Validate the following: # 1. deploy Vm without specifying the startvm parameter @@ -221,10 +221,10 @@ class TestDeployVM(cloudstackTestCase): self.fail("SSH to VM instance failed!") return + @attr(tags = ["advanced", "eip", "advancedns", "basic", "sg"]) def test_02_deploy_vm_startvm_true(self): """Test Deploy Virtual Machine with startVM=true parameter """ - tags = ["advanced", "eip", "advancedns", "basic", "sg"] # Validate the following: # 1. deploy Vm with the startvm=true @@ -276,10 +276,10 @@ class TestDeployVM(cloudstackTestCase): self.fail("SSH to VM instance failed!") return + @attr(tags = ["advanced", "eip", "advancedns", "basic", "sg"]) def test_03_deploy_vm_startvm_false(self): """Test Deploy Virtual Machine with startVM=false parameter """ - tags = ["advanced", "eip", "advancedns", "basic", "sg"] # Validate the following: # 1. deploy Vm with the startvm=false @@ -368,10 +368,10 @@ class TestDeployVM(cloudstackTestCase): ) return + @attr(tags = ["advanced", "eip", "advancedns", "basic", "sg"]) def test_04_deploy_startvm_false_attach_volume(self): """Test Deploy Virtual Machine with startVM=false and attach volume """ - tags = ["advanced", "eip", "advancedns", "basic", "sg"] # Validate the following: # 1. deploy Vm with the startvm=false. Attach volume to the instance @@ -434,11 +434,11 @@ class TestDeployVM(cloudstackTestCase): self.fail("Attach volume failed!") return + @attr(tags = ["advanced", "eip", "advancedns", "basic", "sg"]) def test_05_deploy_startvm_false_change_so(self): """Test Deploy Virtual Machine with startVM=false and change service offering """ - tags = ["advanced", "eip", "advancedns", "basic", "sg"] # Validate the following: # 1. deploy Vm with the startvm=false. Attach volume to the instance @@ -547,11 +547,11 @@ class TestDeployVM(cloudstackTestCase): ) return + @attr(tags = ["advanced", "eip", "advancedns", "basic", "sg"]) def test_06_deploy_startvm_attach_detach(self): """Test Deploy Virtual Machine with startVM=false and attach detach volumes """ - tags = ["advanced", "eip", "advancedns", "basic", "sg"] # Validate the following: # 1. deploy Vm with the startvm=false. Attach volume to the instance @@ -632,10 +632,10 @@ class TestDeployVM(cloudstackTestCase): ) return + @attr(tags = ["advanced", "eip", "advancedns", "basic", "sg"]) def test_07_deploy_startvm_attach_iso(self): """Test Deploy Virtual Machine with startVM=false and attach ISO """ - tags = ["advanced", "eip", "advancedns", "basic", "sg"] # Validate the following: # 1. deploy Vm with the startvm=false. Attach volume to the instance @@ -723,11 +723,11 @@ class TestDeployVM(cloudstackTestCase): ) return + @attr(tags = ["advanced", "eip", "advancedns", "basic", "sg"]) def test_08_deploy_attach_volume(self): """Test Deploy Virtual Machine with startVM=false and attach volume already attached to different machine """ - tags = ["advanced", "eip", "advancedns", "basic", "sg"] # Validate the following: # 1. deploy Vm with the startvm=false. Attach volume to the instance @@ -923,10 +923,10 @@ class TestDeployHaEnabledVM(cloudstackTestCase): except Exception as e: self.debug("Warning! Exception in tearDown: %s" % e) + @attr(tags = ["advanced", "eip", "advancedns", "basic", "sg"]) def test_01_deploy_ha_vm_startvm_false(self): """Test Deploy HA enabled Virtual Machine with startvm=false """ - tags = ["advanced", "eip", "advancedns", "basic", "sg"] # Validate the following: # 1. deployHA enabled Vm with the startvm parameter = false @@ -972,10 +972,10 @@ class TestDeployHaEnabledVM(cloudstackTestCase): ) return + @attr(tags = ["advanced", "eip", "advancedns", "basic", "sg"]) def test_02_deploy_ha_vm_from_iso(self): """Test Deploy HA enabled Virtual Machine from ISO """ - tags = ["advanced", "eip", "advancedns", "basic", "sg"] # Validate the following: # 1. deployHA enabled Vm using ISO with the startvm parameter=true @@ -1037,10 +1037,10 @@ class TestDeployHaEnabledVM(cloudstackTestCase): ) return + @attr(tags = ["advanced", "eip", "advancedns", "basic", "sg"]) def test_03_deploy_ha_vm_iso_startvm_false(self): """Test Deploy HA enabled Virtual Machine from ISO with startvm=false """ - tags = ["advanced", "eip", "advancedns", "basic", "sg"] # Validate the following: # 1. deployHA enabled Vm using ISO with the startvm parameter=false @@ -1154,10 +1154,10 @@ class TestRouterStateAfterDeploy(cloudstackTestCase): except Exception as e: self.debug("Warning! Exception in tearDown: %s" % e) + @attr(tags = ["advanced", "eip", "advancedns", "basic", "sg"]) def test_01_deploy_vm_no_startvm(self): """Test Deploy Virtual Machine with no startVM parameter """ - tags = ["advanced", "eip", "advancedns", "basic", "sg"] # Validate the following: # 1. deploy Vm without specifying the startvm parameter @@ -1369,10 +1369,10 @@ class TestDeployVMBasicZone(cloudstackTestCase): except Exception as e: self.debug("Warning! Exception in tearDown: %s" % e) + @attr(tags = ["eip", "basic", "sg"]) def test_01_deploy_vm_startvm_true(self): """Test Deploy Virtual Machine with startVM=true parameter """ - tags = ["eip", "basic", "sg"] # Validate the following: # 1. deploy Vm with the startvm=true @@ -1427,10 +1427,10 @@ class TestDeployVMBasicZone(cloudstackTestCase): ) return + @attr(tags = ["eip", "basic", "sg"]) def test_02_deploy_vm_startvm_false(self): """Test Deploy Virtual Machine with startVM=true parameter """ - tags = ["eip", "basic", "sg"] # Validate the following: # 1. deploy Vm with the startvm=true @@ -1584,11 +1584,11 @@ class TestDeployVMFromTemplate(cloudstackTestCase): except Exception as e: self.debug("Warning! Exception in tearDown: %s" % e) + @attr(tags = ["advanced", "eip", "advancedns", "basic", "sg"]) def test_deploy_vm_password_enabled(self): """Test Deploy Virtual Machine with startVM=false & enabledpassword in template """ - tags = ["advanced", "eip", "advancedns", "basic", "sg"] # Validate the following: # 1. Create the password enabled template @@ -1722,10 +1722,10 @@ class TestVMAccountLimit(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "eip", "advancedns", "basic", "sg"]) def test_vm_per_account(self): """Test VM limit per account """ - tags = ["advanced", "eip", "advancedns", "basic", "sg"] # Validate the following # 1. Set the resource limit for VM per account. @@ -1838,10 +1838,10 @@ class TestUploadAttachVolume(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "eip", "advancedns", "basic", "sg"]) def test_upload_attach_volume(self): """Test Upload volume and attach to VM in stopped state """ - tags = ["advanced", "eip", "advancedns", "basic", "sg"] # Validate the following # 1. Upload the volume using uploadVolume API call diff --git a/test/integration/component/test_templates.py b/test/integration/component/test_templates.py index 4c96bf47ef6..0f0614872dd 100644 --- a/test/integration/component/test_templates.py +++ b/test/integration/component/test_templates.py @@ -156,10 +156,10 @@ class TestCreateTemplate(cloudstackTestCase): return + @attr(tags = ["advanced", "advancedns"]) def test_01_create_template(self): """Test create public & private template """ - tags = ["advanced", "advancedns"] # Validate the following: # 1. Upload a templates in raw img format. Create a Vm instances from # raw img template. @@ -372,10 +372,10 @@ class TestTemplates(cloudstackTestCase): return + @attr(tags = ["advanced", "advancedns"]) def test_01_create_template_volume(self): """Test Create template from volume """ - tags = ["advanced", "advancedns"] # Validate the following: # 1. Deploy new VM using the template created from Volume @@ -412,9 +412,9 @@ class TestTemplates(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns"]) def test_02_copy_template(self): """Test for copy template from one zone to another""" - tags = ["advanced", "advancedns"] # Validate the following # 1. copy template should be successful and @@ -470,10 +470,10 @@ class TestTemplates(cloudstackTestCase): self.apiclient.deleteTemplate(cmd) return + @attr(tags = ["advanced", "advancedns"]) def test_03_delete_template(self): """Test Delete template """ - tags = ["advanced", "advancedns"] # Validate the following: # 1. Create a template and verify it is shown in list templates response @@ -525,10 +525,10 @@ class TestTemplates(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns"]) def test_04_template_from_snapshot(self): """Create Template from snapshot """ - tags = ["advanced", "advancedns"] # Validate the following # 2. Snapshot the Root disk diff --git a/test/integration/component/test_upload_volumes.py b/test/integration/component/test_upload_volumes.py index 1a7594e1d2a..e5ba376892d 100644 --- a/test/integration/component/test_upload_volumes.py +++ b/test/integration/component/test_upload_volumes.py @@ -158,11 +158,11 @@ class TestUploadDataDisk(cloudstackTestCase): except Exception as e: raise Exception("Warning: Exception during cleanup : %s" % e) + @attr(tags = ["advanced", "basic", "eip", "advancedns", "sg"]) def test_01_upload_data_disk(self): """Test Upload a data disk """ - tags = ["advanced", "basic", "eip", "advancedns", "sg"] # Validate the following # 1. call upload volume API with following parameters HTTP URL of the @@ -211,11 +211,11 @@ class TestUploadDataDisk(cloudstackTestCase): ) return + @attr(tags = ["advanced", "basic", "eip", "advancedns", "sg"]) def test_02_upload_volume_limit(self): """Test upload volume limits """ - tags = ["advanced", "basic", "eip", "advancedns", "sg"] # Validate the following # 1. Update the volume resource limit for account to 1 @@ -316,11 +316,11 @@ class TestUploadDiskDiffFormat(cloudstackTestCase): except Exception as e: raise Exception("Warning: Exception during cleanup : %s" % e) + @attr(tags = ["advanced", "basic", "eip", "advancedns", "sg"]) def test_upload_disk_diff_format(self): """Test Upload a data disk in different format """ - tags = ["advanced", "basic", "eip", "advancedns", "sg"] # Validate the following # 1. call upload volume API with following parameters HTTP URL of the @@ -449,11 +449,11 @@ class TestUploadAttachDisk(cloudstackTestCase): except Exception as e: raise Exception("Warning: Exception during cleanup : %s" % e) + @attr(tags = ["advanced", "basic", "eip", "advancedns", "sg"]) def test_upload_attach_data_disk(self): """Test Upload and attach a data disk """ - tags = ["advanced", "basic", "eip", "advancedns", "sg"] # Validate the following # 1. call upload volume API with following parameters HTTP URL of the @@ -602,11 +602,11 @@ class TestUploadAttachDiskDiffFormat(cloudstackTestCase): except Exception as e: raise Exception("Warning: Exception during cleanup : %s" % e) + @attr(tags = ["advanced", "basic", "eip", "advancedns", "sg"]) def test_upload_disk_diff_format(self): """Test Upload a data disk in different format """ - tags = ["advanced", "basic", "eip", "advancedns", "sg"] # Validate the following # 1. call upload volume API with following parameters HTTP URL of the @@ -757,11 +757,11 @@ class TestUploadDiskMultiStorage(cloudstackTestCase): except Exception as e: raise Exception("Warning: Exception during cleanup : %s" % e) + @attr(tags = ["advanced", "basic", "eip", "advancedns", "sg"]) def test_01_upload_volume_multi_sec_storage(self): """Test Upload a data disk when multiple sec storages are present """ - tags = ["advanced", "basic", "eip", "advancedns", "sg"] # Validate the following # 1. Assume multiple secondary storages are present in a zone @@ -826,11 +826,11 @@ class TestUploadDiskMultiStorage(cloudstackTestCase): ) return + @attr(tags = ["advanced", "basic", "eip", "advancedns", "sg"]) def test_02_upload_volume_multi_pri_storage(self): """Test Upload a data disk when multiple primary storages are present """ - tags = ["advanced", "basic", "eip", "advancedns", "sg"] # Validate the following # 1. Assume multiple primary storages are present in a pod diff --git a/test/integration/component/test_usage.py b/test/integration/component/test_usage.py index 5aea3e63c8b..166b75a02a6 100644 --- a/test/integration/component/test_usage.py +++ b/test/integration/component/test_usage.py @@ -174,10 +174,10 @@ class TestVmUsage(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) def test_01_vm_usage(self): """Test Create/Destroy VM and verify usage calculation """ - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following # 1. Create a VM. Verify usage_events table contains VM .create, # VM.start , Network.offering.assign , Volume.create events @@ -365,10 +365,10 @@ class TestPublicIPUsage(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "eip", "advancedns"]) def test_01_public_ip_usage(self): """Test Assign new IP and verify usage calculation """ - tags = ["advanced", "eip", "advancedns"] # Validate the following # 1. Aquire a IP for the network of this account. Verify usage_event # table has Acquire IP event for the IP for this account @@ -512,10 +512,10 @@ class TestVolumeUsage(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) def test_01_volume_usage(self): """Test Create/delete a volume and verify correct usage is recorded """ - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following # 1. Volume.create event for both root and data disk is there for the # created account in cloud.usage_event table @@ -694,10 +694,10 @@ class TestTemplateUsage(cloudstackTestCase): return def test_01_template_usage(self): + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) """Test Upload/ delete a template and verify correct usage is generated for the template uploaded """ - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following # 1. Create a account # 2. Upload a template from this account. template.create event is @@ -836,10 +836,10 @@ class TestISOUsage(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) def test_01_ISO_usage(self): """Test Create/Delete a ISO and verify its usage is generated correctly """ - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following # 1. Create a account # 2. Upload a ISO from this account. ISO.create event is recorded in @@ -987,10 +987,10 @@ class TestLBRuleUsage(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "eip", "advancedns"]) def test_01_lb_usage(self): """Test Create/Delete a LB rule and verify correct usage is recorded """ - tags = ["advanced", "eip", "advancedns"] # Validate the following # 1. Acquire a IP for this account. lb.rule.create event is registered # for this account in cloud.usage_event table @@ -1142,11 +1142,11 @@ class TestSnapshotUsage(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) def test_01_snapshot_usage(self): """Test Create/Delete a manual snap shot and verify correct usage is recorded """ - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following # 1. Create snapshot of the root disk for this account.Snapshot.create # event is there for the created account in cloud.usage_event table @@ -1313,10 +1313,10 @@ class TestNatRuleUsage(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "advancedns"]) def test_01_nat_usage(self): """Test Create/Delete a PF rule and verify correct usage is recorded """ - tags = ["advanced", "advancedns"] # Validate the following # 1. Acquire a IP for this account # 2. Create a PF rule on the IP associated with this account. @@ -1475,10 +1475,10 @@ class TestVpnUsage(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "advancedns"]) def test_01_vpn_usage(self): """Test Create/Delete a VPN and verify correct usage is recorded """ - tags = ["advanced", "advancedns"] # Validate the following # 1. Enable VPN for this IP. vpn.add.user event is registered for this # account in cloud.usage_event table diff --git a/test/integration/component/test_vmware_drs.py b/test/integration/component/test_vmware_drs.py index 83c830220f3..090e9388f96 100644 --- a/test/integration/component/test_vmware_drs.py +++ b/test/integration/component/test_vmware_drs.py @@ -154,6 +154,7 @@ class TestVMPlacement(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "vmware"])_ def test_vm_creation_in_fully_automated_mode(self): """ Test VM Creation in automation mode = Fully automated This test requires following preconditions: @@ -163,7 +164,6 @@ class TestVMPlacement(cloudstackTestCase): - Another host should have some capacity remaining - DRS Cluster is configured in "Fully automated" mode """ - tags = ["advanced", "vmware", "eip", "advancedns", "basic", "sg"] # Validate the following # 1. Create a new VM in a host which is almost fully utilized # 2 Automatically places VM on the other host @@ -279,7 +279,8 @@ class TestAntiAffinityRules(cloudstackTestCase): except Exception as e: raise Exception("Warning: Exception during cleanup : %s" % e) return - + + @attr(tags = ["advanced", "vmware"]) def test_vmware_anti_affinity(self): """ Test Set up anti-affinity rules @@ -291,7 +292,6 @@ class TestAntiAffinityRules(cloudstackTestCase): - Add host names to host_1,host_2 and IDs of VM 1,2 in the settings class "anti_affinity" above. """ - tags = ["advanced", "vmware", "eip", "advancedns", "basic", "sg"] # Validate the following # 1. Deploy VMs on host 1 and 2 @@ -481,6 +481,7 @@ class TestAffinityRules(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "vmware"]) def test_vmware_affinity(self): """ Test Set up affinity rules @@ -492,7 +493,6 @@ class TestAffinityRules(cloudstackTestCase): - Add host names to host_1,host_2 and IDs of VM 1,2 in the settings class "affinity" above. """ - tags = ["advanced", "vmware", "eip", "advancedns", "basic", "sg"] # Validate the following # 1. Deploy VMs 2 VMs on same hosts diff --git a/test/integration/component/test_volumes.py b/test/integration/component/test_volumes.py index 39abbf77420..55acc4c6a41 100644 --- a/test/integration/component/test_volumes.py +++ b/test/integration/component/test_volumes.py @@ -137,10 +137,10 @@ class TestAttachVolume(cloudstackTestCase): self.dbclient = self.testClient.getDbConnection() self.cleanup = [] + @attr(tags = ["advanced", "advancedns"]) def test_01_volume_attach(self): """Test Attach volumes (max capacity) """ - tags = ["advanced", "advancedns"] # Validate the following # 1. Deploy a vm and create 5 data disk # 2. Attach all the created Volume to the vm. @@ -289,10 +289,10 @@ class TestAttachVolume(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns"]) def test_02_volume_attach_max(self): """Test attach volumes (more than max) to an instance """ - tags = ["advanced", "advancedns"] # Validate the following # 1. Attach one more data volume to VM (Already 5 attached) @@ -420,10 +420,10 @@ class TestAttachDetachVolume(cloudstackTestCase): except Exception as e: raise Exception("Warning: Exception during cleanup : %s" % e) + @attr(tags = ["advanced", "advancedns"]) def test_01_volume_attach_detach(self): """Test Volume attach/detach to VM (5 data volumes) """ - tags = ["advanced", "advancedns"] # Validate the following # 1. Deploy a vm and create 5 data disk @@ -668,10 +668,10 @@ class TestAttachVolumeISO(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "advancedns"]) def test_01_volume_iso_attach(self): """Test Volumes and ISO attach """ - tags = ["advanced", "advancedns"] # Validate the following # 1. Create and attach 5 data volumes to VM @@ -864,10 +864,10 @@ class TestVolumes(cloudstackTestCase): cleanup_resources(self.apiclient, self.cleanup) return + @attr(tags = ["advanced", "advancedns"]) def test_01_attach_volume(self): """Attach a created Volume to a Running VM """ - tags = ["advanced", "advancedns"] # Validate the following # 1. Create a data volume. # 2. List Volumes should not have vmname and virtualmachineid fields in @@ -948,10 +948,10 @@ class TestVolumes(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns"]) def test_02_detach_volume(self): """Detach a Volume attached to a VM """ - tags = ["advanced", "advancedns"] # Validate the following # 1. Data disk should be detached from instance @@ -996,10 +996,10 @@ class TestVolumes(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns"]) def test_03_delete_detached_volume(self): """Delete a Volume unattached to an VM """ - tags = ["advanced", "advancedns"] # Validate the following # 1. volume should be deleted successfully and listVolume should not # contain the deleted volume details. From 8ec4e231945a238ca0cc368f3c5d23ad76fb5da7 Mon Sep 17 00:00:00 2001 From: Pranav Saxena Date: Sat, 18 Aug 2012 14:17:11 +0530 Subject: [PATCH 23/28] Autoscale UI changes as suggested during demo --- ui/css/cloudstack3.css | 10 +++++----- ui/scripts/ui-custom/autoscaler.js | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ui/css/cloudstack3.css b/ui/css/cloudstack3.css index edea1c5c5ab..c18672d50b6 100644 --- a/ui/css/cloudstack3.css +++ b/ui/css/cloudstack3.css @@ -9901,23 +9901,23 @@ div.ui-dialog div.autoscaler div.scale-down-policy-title { } div.ui-dialog div.autoscaler div.scale-up-policy-title div.form-container div.form-item div.value input[type=text] { - margin-left: 195px; + margin-left: 729px; width: 30%; - margin-top: 1px; + margin-top: -17px; } div.ui-dialog div.autoscaler div.scale-up-policy-title div.form-container div.form-item div.name { - margin-left: 390px; + margin-left: 420px; } div.ui-dialog div.autoscaler div.scale-down-policy-title div.form-container div.form-item div.value input[type=text] { - margin-left: 670px; + margin-left: 698px; width: 30%; margin-top: -16px; } div.ui-dialog div.autoscaler div.scale-down-policy-title div.form-container div.form-item div.name { - margin-left: 390px; + margin-left: 420px; } div.ui-dialog div.autoscaler div.scale-up-policy div.multi-edit div.data div.data-body div.data-item { diff --git a/ui/scripts/ui-custom/autoscaler.js b/ui/scripts/ui-custom/autoscaler.js index 3afc8b3414e..f44fda8c664 100644 --- a/ui/scripts/ui-custom/autoscaler.js +++ b/ui/scripts/ui-custom/autoscaler.js @@ -183,7 +183,7 @@ form: { title: '', fields: { - scaleUpDuration: { label: 'Duration', validation: { required: true } } + scaleUpDuration: { label: 'Duration(in sec)', validation: { required: true } } } } }); @@ -197,7 +197,7 @@ form: { title: '', fields: { - scaleDownDuration: { label: 'Duration', validation: { required: true } } + scaleDownDuration: { label: 'Duration(in sec)', validation: { required: true } } } } }); From b4a1c79037197a7479303623e08c641538e1fa5f Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Mon, 20 Aug 2012 11:01:22 +0530 Subject: [PATCH 24/28] adding attributes to the smoke tests --- test/integration/smoke/test_disk_offerings.py | 4 +++ test/integration/smoke/test_hosts.py | 2 ++ test/integration/smoke/test_iso.py | 15 ++++++--- test/integration/smoke/test_network.py | 13 +++++++- .../integration/smoke/test_primary_storage.py | 2 ++ test/integration/smoke/test_routers.py | 14 ++++++++- .../smoke/test_secondary_storage.py | 5 ++- .../smoke/test_service_offerings.py | 6 +++- test/integration/smoke/test_snapshots.py | 21 +++++++++++-- test/integration/smoke/test_ssvm.py | 11 +++++++ test/integration/smoke/test_templates.py | 17 +++++++--- test/integration/smoke/test_vm_life_cycle.py | 31 +++++++++++-------- test/integration/smoke/test_volumes.py | 12 +++++-- 13 files changed, 123 insertions(+), 30 deletions(-) diff --git a/test/integration/smoke/test_disk_offerings.py b/test/integration/smoke/test_disk_offerings.py index f38e73ba2a7..1d26a6fe025 100644 --- a/test/integration/smoke/test_disk_offerings.py +++ b/test/integration/smoke/test_disk_offerings.py @@ -20,6 +20,7 @@ from marvin.cloudstackAPI import * from integration.lib.utils import * from integration.lib.base import * from integration.lib.common import * +from nose.plugins.attrib import attr class Services: """Test Disk offerings Services @@ -53,6 +54,7 @@ class TestCreateDiskOffering(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "basic", "eip", "sg", "advancedns", "simulator", "smoke"]) def test_01_create_disk_offering(self): """Test to create disk offering""" @@ -139,6 +141,7 @@ class TestDiskOfferings(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "basic", "eip", "sg", "advancedns", "simulator", "smoke"]) def test_02_edit_disk_offering(self): """Test to update existing disk offering""" @@ -189,6 +192,7 @@ class TestDiskOfferings(cloudstackTestCase): ) return + @attr(tags = ["advanced", "basic", "eip", "sg", "advancedns", "simulator", "smoke"]) def test_03_delete_disk_offering(self): """Test to delete disk offering""" diff --git a/test/integration/smoke/test_hosts.py b/test/integration/smoke/test_hosts.py index 2fafb76a50b..204ffddaa5f 100644 --- a/test/integration/smoke/test_hosts.py +++ b/test/integration/smoke/test_hosts.py @@ -20,6 +20,7 @@ from marvin.cloudstackAPI import * from integration.lib.utils import * from integration.lib.base import * from integration.lib.common import * +from nose.plugins.attrib import attr #Import System modules import time @@ -113,6 +114,7 @@ class TestHosts(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @unittest.skip("skipped - our environments will not add hosts") def test_01_clusters(self): """Test Add clusters & hosts - XEN, KVM, VWARE """ diff --git a/test/integration/smoke/test_iso.py b/test/integration/smoke/test_iso.py index e1f8dfeb4b7..16089d8945e 100644 --- a/test/integration/smoke/test_iso.py +++ b/test/integration/smoke/test_iso.py @@ -20,6 +20,7 @@ from marvin.cloudstackAPI import * from integration.lib.utils import * from integration.lib.base import * from integration.lib.common import * +from nose.plugins.attrib import attr import urllib from random import random #Import System modules @@ -39,7 +40,7 @@ class Services: "username": "test", # Random characters are appended in create account to # ensure unique username generated each time - "password": "fr3sca", + "password": "password", }, "iso_1": { @@ -50,7 +51,7 @@ class Services: "isextractable": True, "isfeatured": True, "ispublic": True, - "ostypeid": '5776c0d2-f331-42db-ba3a-29f1f8319bc9', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', }, "iso_2": { @@ -61,7 +62,7 @@ class Services: "isextractable": True, "isfeatured": True, "ispublic": True, - "ostypeid": '5776c0d2-f331-42db-ba3a-29f1f8319bc9', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', "mode": 'HTTP_DOWNLOAD', # Used in Extract template, value must be HTTP_DOWNLOAD }, @@ -74,7 +75,7 @@ class Services: "passwordenabled": True, "sleep": 60, "timeout": 10, - "ostypeid": '5776c0d2-f331-42db-ba3a-29f1f8319bc9', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', # CentOS 5.3 (64 bit) "mode": 'advanced' # Networking mode: Basic or Advanced @@ -114,6 +115,7 @@ class TestCreateIso(cloudstackTestCase): return + @attr(tags = ["advanced", "basic", "eip", "sg", "advancedns", "smoke"]) def test_01_create_iso(self): """Test create public & private ISO """ @@ -251,6 +253,7 @@ class TestISO(cloudstackTestCase): return + @attr(tags = ["advanced", "basic", "eip", "sg", "advancedns", "smoke"]) def test_02_edit_iso(self): """Test Edit ISO """ @@ -315,6 +318,7 @@ class TestISO(cloudstackTestCase): ) return + @attr(tags = ["advanced", "basic", "eip", "sg", "advancedns", "smoke"]) def test_03_delete_iso(self): """Test delete ISO """ @@ -342,6 +346,7 @@ class TestISO(cloudstackTestCase): ) return + @attr(tags = ["advanced", "basic", "eip", "sg", "advancedns", "smoke"]) def test_04_extract_Iso(self): "Test for extract ISO" @@ -392,6 +397,7 @@ class TestISO(cloudstackTestCase): ) return + @attr(tags = ["advanced", "basic", "eip", "sg", "advancedns", "smoke"]) def test_05_iso_permissions(self): """Update & Test for ISO permissions""" @@ -443,6 +449,7 @@ class TestISO(cloudstackTestCase): ) return + @attr(tags = ["advanced", "basic", "eip", "sg", "advancedns", "smoke", "multizone"]) def test_06_copy_iso(self): """Test for copy ISO from one zone to another""" diff --git a/test/integration/smoke/test_network.py b/test/integration/smoke/test_network.py index d61bbe1d69b..3385ac60bc6 100644 --- a/test/integration/smoke/test_network.py +++ b/test/integration/smoke/test_network.py @@ -21,6 +21,7 @@ from marvin import remoteSSHClient from integration.lib.utils import * from integration.lib.base import * from integration.lib.common import * +from nose.plugins.attrib import attr #Import System modules import time @@ -31,7 +32,7 @@ class Services: def __init__(self): self.services = { - "ostypeid": '1a568aed-db2d-41ca-b644-416b0bdc067e', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', # Cent OS 5.3 (64 bit) "mode": 'advanced', # Networking mode: Basic or advanced @@ -183,6 +184,7 @@ class TestPublicIP(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_public_ip_admin_account(self): """Test for Associate/Disassociate public IP address for admin account""" @@ -233,6 +235,7 @@ class TestPublicIP(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_public_ip_user_account(self): """Test for Associate/Disassociate public IP address for user account""" @@ -343,6 +346,7 @@ class TestPortForwarding(cloudstackTestCase): cleanup_resources(self.apiclient, self.cleanup) return + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_01_port_fwd_on_src_nat(self): """Test for port forwarding on source NAT""" @@ -465,6 +469,7 @@ class TestPortForwarding(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_02_port_fwd_on_non_src_nat(self): """Test for port forwarding on non source NAT""" @@ -661,6 +666,7 @@ class TestLoadBalancingRule(cloudstackTestCase): cleanup_resources(cls.api_client, cls._cleanup) return + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_01_create_lb_rule_src_nat(self): """Test to create Load balancing rule with source NAT""" @@ -868,6 +874,7 @@ class TestLoadBalancingRule(cloudstackTestCase): ssh_1.execute("hostname")[0] return + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_02_create_lb_rule_non_nat(self): """Test to create Load balancing rule with source NAT""" @@ -1138,6 +1145,7 @@ class TestRebootRouter(cloudstackTestCase): ] return + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_reboot_router(self): """Test for reboot router""" @@ -1273,6 +1281,7 @@ class TestAssignRemoveLB(cloudstackTestCase): ] return + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_assign_and_removal_lb(self): """Test for assign & removing load balancing rule""" @@ -1547,6 +1556,7 @@ class TestReleaseIP(cloudstackTestCase): def tearDown(self): cleanup_resources(self.apiclient, self.cleanup) + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_releaseIP(self): """Test for Associate/Disassociate public IP address""" @@ -1675,6 +1685,7 @@ class TestDeleteAccount(cloudstackTestCase): self.cleanup = [] return + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_delete_account(self): """Test for delete account""" diff --git a/test/integration/smoke/test_primary_storage.py b/test/integration/smoke/test_primary_storage.py index efceebe3cda..2629f5a3740 100644 --- a/test/integration/smoke/test_primary_storage.py +++ b/test/integration/smoke/test_primary_storage.py @@ -19,6 +19,7 @@ from marvin.cloudstackTestCase import * from marvin.cloudstackAPI import * from integration.lib.utils import * from integration.lib.base import * +from nose.plugins.attrib import attr from integration.lib.common import * #Import System modules @@ -80,6 +81,7 @@ class TestPrimaryStorageServices(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @unittest.skip("skipped - will not be adding storage in our environments") def test_01_primary_storage(self): """Test primary storage pools - XEN, KVM, VMWare """ diff --git a/test/integration/smoke/test_routers.py b/test/integration/smoke/test_routers.py index 8b60933cfe6..2deabc295df 100644 --- a/test/integration/smoke/test_routers.py +++ b/test/integration/smoke/test_routers.py @@ -21,6 +21,7 @@ from marvin import remoteSSHClient from integration.lib.utils import * from integration.lib.base import * from integration.lib.common import * +from nose.plugins.attrib import attr #Import System modules import time @@ -56,7 +57,7 @@ class Services: "username": "testuser", "password": "password", }, - "ostypeid":'1a568aed-db2d-41ca-b644-416b0bdc067e', + "ostypeid":'01853327-513e-4508-9628-f1f55db1946f', "sleep": 60, "timeout": 10, "mode": 'advanced', #Networking mode: Basic, Advanced @@ -126,6 +127,7 @@ class TestRouterServices(cloudstackTestCase): self.apiclient = self.testClient.getApiClient() return + @attr(tags = ["advanced", "basic", "sg", "smoke"]) def test_01_router_internal_basic(self): """Test router internal basic zone """ @@ -187,6 +189,7 @@ class TestRouterServices(cloudstackTestCase): ) return + @attr(tags = ["advanced", "smoke"]) def test_02_router_internal_adv(self): """Test router internal advanced zone """ @@ -264,6 +267,7 @@ class TestRouterServices(cloudstackTestCase): self.debug("Haproxy process status: %s" % res) return + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_03_restart_network_cleanup(self): """Test restart network """ @@ -341,6 +345,7 @@ class TestRouterServices(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_04_restart_network_wo_cleanup(self): """Test restart network without cleanup """ @@ -441,6 +446,7 @@ class TestRouterServices(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_05_router_basic(self): """Test router basic setup """ @@ -506,6 +512,7 @@ class TestRouterServices(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_06_router_advanced(self): """Test router advanced setup """ @@ -588,6 +595,7 @@ class TestRouterServices(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_07_stop_router(self): """Test stop router """ @@ -631,6 +639,7 @@ class TestRouterServices(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_08_start_router(self): """Test start router """ @@ -675,6 +684,7 @@ class TestRouterServices(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_09_reboot_router(self): """Test reboot router """ @@ -727,6 +737,8 @@ class TestRouterServices(cloudstackTestCase): ) return + @attr(configuration = "network.gc") + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_10_network_gc(self): """Test network GC """ diff --git a/test/integration/smoke/test_secondary_storage.py b/test/integration/smoke/test_secondary_storage.py index 0edbe7bdfe2..474e2ee35eb 100644 --- a/test/integration/smoke/test_secondary_storage.py +++ b/test/integration/smoke/test_secondary_storage.py @@ -20,6 +20,7 @@ from marvin.cloudstackAPI import * from integration.lib.utils import * from integration.lib.base import * from integration.lib.common import * +from nose.plugins.attrib import attr #Import System modules import time @@ -81,7 +82,7 @@ class TestSecStorageServices(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @unittest.skip("do not add secondary storage") + @unittest.skip("skipped - do not add secondary storage") def test_01_add_sec_storage(self): """Test secondary storage """ @@ -135,6 +136,7 @@ class TestSecStorageServices(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns", "smoke", "basic", "eip", "sg"]) def test_02_sys_vm_start(self): """Test system VM start """ @@ -265,6 +267,7 @@ class TestSecStorageServices(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns", "smoke", "basic", "eip", "sg"]) def test_03_sys_template_ready(self): """Test system templates are ready """ diff --git a/test/integration/smoke/test_service_offerings.py b/test/integration/smoke/test_service_offerings.py index bf9ccd14a6c..7f13c5c438d 100644 --- a/test/integration/smoke/test_service_offerings.py +++ b/test/integration/smoke/test_service_offerings.py @@ -20,6 +20,7 @@ from marvin.cloudstackAPI import * from integration.lib.utils import * from integration.lib.base import * from integration.lib.common import * +from nose.plugins.attrib import attr class Services: @@ -56,7 +57,8 @@ class TestCreateServiceOffering(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - + + @attr(tags = ["advanced", "advancedns", "smoke", "basic", "eip", "sg"]) def test_01_create_service_offering(self): """Test to create service offering""" @@ -162,6 +164,7 @@ class TestServiceOfferings(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "advancedns", "smoke", "basic", "eip", "sg"]) def test_02_edit_service_offering(self): """Test to update existing service offering""" @@ -212,6 +215,7 @@ class TestServiceOfferings(cloudstackTestCase): return + @attr(tags = ["advanced", "advancedns", "smoke", "basic", "eip", "sg"]) def test_03_delete_service_offering(self): """Test to delete service offering""" diff --git a/test/integration/smoke/test_snapshots.py b/test/integration/smoke/test_snapshots.py index 91e65a41a0d..526f80da91b 100644 --- a/test/integration/smoke/test_snapshots.py +++ b/test/integration/smoke/test_snapshots.py @@ -21,6 +21,7 @@ from marvin.remoteSSHClient import remoteSSHClient from integration.lib.utils import * from integration.lib.base import * from integration.lib.common import * +from nose.plugins.attrib import attr class Services: @@ -36,7 +37,7 @@ class Services: "username": "test", # Random characters are appended for unique # username - "password": "fr3sca", + "password": "password", }, "service_offering": { "name": "Tiny Instance", @@ -89,10 +90,10 @@ class Services: { "displaytext": 'Template from snapshot', "name": 'Template from snapshot', - "ostypeid": '5776c0d2-f331-42db-ba3a-29f1f8319bc9', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', "templatefilter": 'self', }, - "ostypeid": '5776c0d2-f331-42db-ba3a-29f1f8319bc9', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', # Cent OS 5.3 (64 bit) "diskdevice": "/dev/xvdb", # Data Disk "rootdisk": "/dev/xvda", # Root Disk @@ -188,6 +189,8 @@ class TestSnapshotRootDisk(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(speed = "slow") + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_01_snapshot_root_disk(self): """Test Snapshot Root Disk """ @@ -428,6 +431,8 @@ class TestSnapshots(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(speed = "slow") + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_02_snapshot_data_disk(self): """Test Snapshot Data Disk """ @@ -568,6 +573,8 @@ class TestSnapshots(cloudstackTestCase): ) return + @attr(speed = "slow") + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_03_volume_from_snapshot(self): """Create volumes from snapshots """ @@ -749,6 +756,8 @@ class TestSnapshots(cloudstackTestCase): self.new_virtual_machine.ipaddress) return + @attr(speed = "slow") + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_04_delete_snapshot(self): """Test Delete Snapshot """ @@ -788,6 +797,8 @@ class TestSnapshots(cloudstackTestCase): ) return + @attr(speed = "slow") + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_05_recurring_snapshot_root_disk(self): """Test Recurring Snapshot Root Disk """ @@ -879,6 +890,8 @@ class TestSnapshots(cloudstackTestCase): ) return + @attr(speed = "slow") + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_06_recurring_snapshot_data_disk(self): """Test Recurring Snapshot data Disk """ @@ -973,6 +986,8 @@ class TestSnapshots(cloudstackTestCase): ) return + @attr(speed = "slow") + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_07_template_from_snapshot(self): """Create Template from snapshot """ diff --git a/test/integration/smoke/test_ssvm.py b/test/integration/smoke/test_ssvm.py index 0e341d5a74a..3a904edfda8 100644 --- a/test/integration/smoke/test_ssvm.py +++ b/test/integration/smoke/test_ssvm.py @@ -21,6 +21,7 @@ from marvin import remoteSSHClient from integration.lib.utils import * from integration.lib.base import * from integration.lib.common import * +from nose.plugins.attrib import attr import telnetlib #Import System modules @@ -60,6 +61,7 @@ class TestSSVMs(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(tags = ["advanced", "advancedns", "smoke", "basic", "sg"]) def test_01_list_sec_storage_vm(self): """Test List secondary storage VMs """ @@ -177,6 +179,7 @@ class TestSSVMs(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns", "smoke", "basic", "sg"]) def test_02_list_cpvm_vm(self): """Test List console proxy VMs """ @@ -288,6 +291,7 @@ class TestSSVMs(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns", "smoke", "basic", "sg"]) def test_03_ssvm_internals(self): """Test SSVM Internals""" @@ -368,6 +372,7 @@ class TestSSVMs(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns", "smoke", "basic", "sg"]) def test_04_cpvm_internals(self): """Test CPVM Internals""" @@ -434,6 +439,7 @@ class TestSSVMs(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns", "smoke", "basic", "sg"]) def test_05_stop_ssvm(self): """Test stop SSVM """ @@ -509,6 +515,7 @@ class TestSSVMs(cloudstackTestCase): self.test_03_ssvm_internals() return + @attr(tags = ["advanced", "advancedns", "smoke", "basic", "sg"]) def test_06_stop_cpvm(self): """Test stop CPVM """ @@ -581,6 +588,7 @@ class TestSSVMs(cloudstackTestCase): self.test_04_cpvm_internals() return + @attr(tags = ["advanced", "advancedns", "smoke", "basic", "sg"]) def test_07_reboot_ssvm(self): """Test reboot SSVM """ @@ -666,6 +674,7 @@ class TestSSVMs(cloudstackTestCase): self.test_03_ssvm_internals() return + @attr(tags = ["advanced", "advancedns", "smoke", "basic", "sg"]) def test_08_reboot_cpvm(self): """Test reboot CPVM """ @@ -752,6 +761,7 @@ class TestSSVMs(cloudstackTestCase): self.test_04_cpvm_internals() return + @attr(tags = ["advanced", "advancedns", "smoke", "basic", "sg"]) def test_09_destroy_ssvm(self): """Test destroy SSVM """ @@ -833,6 +843,7 @@ class TestSSVMs(cloudstackTestCase): self.test_03_ssvm_internals() return + @attr(tags = ["advanced", "advancedns", "smoke", "basic", "sg"]) def test_10_destroy_cpvm(self): """Test destroy CPVM """ diff --git a/test/integration/smoke/test_templates.py b/test/integration/smoke/test_templates.py index b17b93fda19..0e462785f8a 100644 --- a/test/integration/smoke/test_templates.py +++ b/test/integration/smoke/test_templates.py @@ -21,6 +21,7 @@ from marvin.remoteSSHClient import remoteSSHClient from integration.lib.utils import * from integration.lib.base import * from integration.lib.common import * +from nose.plugins.attrib import attr import urllib from random import random #Import System modules @@ -40,7 +41,7 @@ class Services: "username": "test", # Random characters are appended for unique # username - "password": "fr3sca", + "password": "password", }, "service_offering": { "name": "Tiny Instance", @@ -70,12 +71,12 @@ class Services: "template_1": { "displaytext": "Cent OS Template", "name": "Cent OS Template", - "ostypeid": '946b031b-0e10-4f4a-a3fc-d212ae2ea07f', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', }, "template_2": { "displaytext": "Public Template", "name": "Public template", - "ostypeid": '946b031b-0e10-4f4a-a3fc-d212ae2ea07f', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', "isfeatured": True, "ispublic": True, "isextractable": True, @@ -89,7 +90,7 @@ class Services: "isextractable": False, "bootable": True, "passwordenabled": True, - "ostypeid": '946b031b-0e10-4f4a-a3fc-d212ae2ea07f', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', "mode": 'advanced', # Networking mode: Advanced, basic "sleep": 30, @@ -214,6 +215,7 @@ class TestCreateTemplate(cloudstackTestCase): return + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_01_create_template(self): """Test create public & private template """ @@ -423,6 +425,7 @@ class TestTemplates(cloudstackTestCase): return + @attr(tags = ["advanced", "advancedns", "smoke", "basic", "sg"]) def test_02_edit_template(self): """Test Edit template """ @@ -505,6 +508,7 @@ class TestTemplates(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns", "smoke", "basic", "sg"]) def test_03_delete_template(self): """Test delete template """ @@ -533,6 +537,7 @@ class TestTemplates(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns", "smoke", "basic", "sg"]) def test_04_extract_template(self): "Test for extract template" @@ -583,6 +588,7 @@ class TestTemplates(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns", "smoke", "basic", "sg"]) def test_05_template_permissions(self): """Update & Test for template permissions""" @@ -635,6 +641,7 @@ class TestTemplates(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns", "smoke", "basic", "sg", "multizone"]) def test_06_copy_template(self): """Test for copy template from one zone to another""" @@ -690,6 +697,7 @@ class TestTemplates(cloudstackTestCase): self.apiclient.deleteTemplate(cmd) return + @attr(tags = ["advanced", "advancedns", "smoke", "basic", "sg"]) def test_07_list_public_templates(self): """Test only public templates are visible to normal user""" @@ -721,6 +729,7 @@ class TestTemplates(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns", "smoke", "basic", "sg"]) def test_08_list_system_templates(self): """Test System templates are not visible to normal user""" diff --git a/test/integration/smoke/test_vm_life_cycle.py b/test/integration/smoke/test_vm_life_cycle.py index 33824743c0f..076edcfa7cf 100644 --- a/test/integration/smoke/test_vm_life_cycle.py +++ b/test/integration/smoke/test_vm_life_cycle.py @@ -21,6 +21,7 @@ from marvin.remoteSSHClient import remoteSSHClient from integration.lib.utils import * from integration.lib.base import * from integration.lib.common import * +from nose.plugins.attrib import attr #Import System modules import time @@ -102,9 +103,9 @@ class Services: { "displaytext": "Test ISO", "name": "testISO", - "url": "http://nfs1.lab.vmops.com/isos_32bit/dsl-4.4.10.iso", + "url": "http://iso.linuxquestions.org/download/504/1819/http/gd4.tuwien.ac.at/dsl-4.4.10.iso", # Source URL where ISO is located - "ostypeid": '93ffa3ea-ef02-4e56-9940-f04158353555', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', "mode": 'HTTP_DOWNLOAD', # Downloading existing ISO }, "template": { @@ -118,7 +119,7 @@ class Services: "sleep": 60, "timeout": 10, #Migrate VM to hostid - "ostypeid": '93ffa3ea-ef02-4e56-9940-f04158353555', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', # CentOS 5.3 (64-bit) "mode":'advanced', } @@ -165,7 +166,7 @@ class TestDeployVM(cloudstackTestCase): self.account ] - + @attr(tags = ["advanced", "advancedns", "smoke", "basic", "sg"]) def test_deploy_vm(self): """Test Deploy Virtual Machine """ @@ -314,6 +315,7 @@ class TestVMLifeCycle(cloudstackTestCase): return + @attr(tags = ["advanced", "advancedns", "smoke", "basic", "sg"]) def test_01_stop_vm(self): """Test Stop Virtual Machine """ @@ -349,7 +351,7 @@ class TestVMLifeCycle(cloudstackTestCase): ) return - + @attr(tags = ["advanced", "advancedns", "smoke", "basic", "sg"]) def test_02_start_vm(self): """Test Start Virtual Machine """ @@ -387,7 +389,7 @@ class TestVMLifeCycle(cloudstackTestCase): ) return - + @attr(tags = ["advanced", "advancedns", "smoke", "basic", "sg"]) def test_03_reboot_vm(self): """Test Reboot Virtual Machine """ @@ -423,7 +425,7 @@ class TestVMLifeCycle(cloudstackTestCase): ) return - + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_04_change_offering_small(self): """Change Offering to a small capacity """ @@ -541,7 +543,7 @@ class TestVMLifeCycle(cloudstackTestCase): ) return - + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_05_change_offering_medium(self): """Change Offering to a medium capacity """ @@ -663,7 +665,7 @@ class TestVMLifeCycle(cloudstackTestCase): ) return - + @attr(tags = ["advanced", "advancedns", "smoke", "basic", "sg"]) def test_06_destroy_vm(self): """Test destroy Virtual Machine """ @@ -699,7 +701,7 @@ class TestVMLifeCycle(cloudstackTestCase): ) return - + @attr(tags = ["advanced", "advancedns", "smoke", "basic", "sg"]) def test_07_restore_vm(self): """Test recover Virtual Machine """ @@ -739,7 +741,7 @@ class TestVMLifeCycle(cloudstackTestCase): return - + @attr(tags = ["advanced", "advancedns", "smoke", "basic", "sg", "multihost"]) def test_08_migrate_vm(self): """Test migrate VM """ @@ -810,6 +812,9 @@ class TestVMLifeCycle(cloudstackTestCase): ) return + @attr(configuration = "expunge.interval") + @attr(configuration = "expunge.delay") + @attr(tags = ["advanced", "advancedns", "smoke", "basic", "sg"]) def test_09_expunge_vm(self): """Test destroy(expunge) Virtual Machine """ @@ -857,7 +862,7 @@ class TestVMLifeCycle(cloudstackTestCase): ) return - + @attr(tags = ["advanced", "advancedns", "smoke", "basic", "sg"]) def test_10_attachAndDetach_iso(self): """Test for detach ISO to virtual machine""" @@ -1099,7 +1104,7 @@ class TestVMPasswordEnabled(cloudstackTestCase): cleanup_resources(self.apiclient, self.cleanup) return - + @attr(tags = ["advanced", "advancedns", "smoke", "basic", "sg"]) def test_11_get_vm_password(self): """Test get VM password for password enabled template""" diff --git a/test/integration/smoke/test_volumes.py b/test/integration/smoke/test_volumes.py index f6b5e79db90..f8b23095336 100644 --- a/test/integration/smoke/test_volumes.py +++ b/test/integration/smoke/test_volumes.py @@ -21,6 +21,7 @@ from marvin.remoteSSHClient import remoteSSHClient from integration.lib.utils import * from integration.lib.base import * from integration.lib.common import * +from nose.plugins.attrib import attr #Import System modules import os import urllib @@ -41,7 +42,7 @@ class Services: "username": "test", # Random characters are appended for unique # username - "password": "fr3sca", + "password": "password", }, "service_offering": { "name": "Tiny Instance", @@ -70,7 +71,7 @@ class Services: "publicport": 22, "protocol": 'TCP', "diskdevice": "/dev/xvdb", - "ostypeid": '946b031b-0e10-4f4a-a3fc-d212ae2ea07f', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', "mode": 'advanced', "sleep": 60, "timeout": 10, @@ -139,6 +140,7 @@ class TestCreateVolume(cloudstackTestCase): self.dbclient = self.testClient.getDbConnection() self.cleanup = [] + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_01_create_volume(self): """Test Volume creation for all Disk Offerings (incl. custom) """ @@ -331,6 +333,7 @@ class TestVolumes(cloudstackTestCase): self.apiClient = self.testClient.getApiClient() self.dbclient = self.testClient.getDbConnection() + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_02_attach_volume(self): """Attach a created Volume to a Running VM """ @@ -376,6 +379,7 @@ class TestVolumes(cloudstackTestCase): (self.virtual_machine.ipaddress, e)) return + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_03_download_attached_volume(self): """Download a Volume attached to a VM """ @@ -395,6 +399,7 @@ class TestVolumes(cloudstackTestCase): with self.assertRaises(Exception): self.apiClient.extractVolume(cmd) + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_04_delete_attached_volume(self): """Delete a Volume attached to a VM """ @@ -418,6 +423,7 @@ class TestVolumes(cloudstackTestCase): "Check for delete download error while volume is attached" ) + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_05_detach_volume(self): """Detach a Volume attached to a VM """ @@ -458,6 +464,7 @@ class TestVolumes(cloudstackTestCase): ) return + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_06_download_detached_volume(self): """Download a Volume unattached to an VM """ @@ -488,6 +495,7 @@ class TestVolumes(cloudstackTestCase): % (extract_vol.url, self.volume.id) ) + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_07_delete_detached_volume(self): """Delete a Volume unattached to an VM """ From 7b25cb35288e709e6dc7ecaa4a0cebfcdefee952 Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Mon, 20 Aug 2012 11:02:21 +0530 Subject: [PATCH 25/28] Splitting resource_limit tests to allocation_states tests --- .../component/test_allocation_states.py | 274 ++++++++++++++++++ 1 file changed, 274 insertions(+) create mode 100644 test/integration/component/test_allocation_states.py diff --git a/test/integration/component/test_allocation_states.py b/test/integration/component/test_allocation_states.py new file mode 100644 index 00000000000..5d702b9f9c6 --- /dev/null +++ b/test/integration/component/test_allocation_states.py @@ -0,0 +1,274 @@ +# -*- encoding: utf-8 -*- +# Copyright 2012 Citrix Systems, Inc. Licensed under the +# Apache License, Version 2.0 (the "License"); you may not use this +# file except in compliance with the License. Citrix Systems, Inc. +# reserves all rights not expressly granted by 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. +# +# Automatically generated by addcopyright.py at 04/03/2012 +import marvin +from nose.plugins.attrib import attr +from marvin.cloudstackTestCase import * +from marvin.cloudstackAPI import * +from integration.lib.utils import * +from integration.lib.base import * +from integration.lib.common import * +import datetime + + +class Services: + """Test Resource Limits Services + """ + + def __init__(self): + self.services = { + "domain": { + "name": "Domain", + }, + "account": { + "email": "test@test.com", + "firstname": "Test", + "lastname": "User", + "username": "test", + # Random characters are appended for unique + # username + "password": "password", + }, + "service_offering": { + "name": "Tiny Instance", + "displaytext": "Tiny Instance", + "cpunumber": 1, + "cpuspeed": 100, # in MHz + "memory": 64, # In MBs + }, + "disk_offering": { + "displaytext": "Small", + "name": "Small", + "disksize": 1 + }, + "volume": { + "diskname": "TestDiskServ", + }, + "server": { + "displayname": "TestVM", + "username": "root", + "password": "password", + "ssh_port": 22, + "hypervisor": 'XenServer', + "privateport": 22, + "publicport": 22, + "protocol": 'TCP', + }, + "template": { + "displaytext": "Cent OS Template", + "name": "Cent OS Template", + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', + "templatefilter": 'self', + }, + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', + # Cent OS 5.3 (64 bit) + "sleep": 60, + "timeout": 10, + "mode": 'advanced', + } + + +class TestAllocationState(cloudstackTestCase): + + @classmethod + def setUpClass(cls): + cls.api_client = super( + TestResources, + cls + ).getClsTestClient().getApiClient() + cls.services = Services().services + # Get Zone, Domain and templates + cls.zone = get_zone(cls.api_client, cls.services) + cls._cleanup = [] + return + + @classmethod + def tearDownClass(cls): + try: + #Cleanup resources used + cleanup_resources(cls.api_client, cls._cleanup) + except Exception as e: + raise Exception("Warning: Exception during cleanup : %s" % e) + return + + def setUp(self): + self.apiclient = self.testClient.getApiClient() + self.dbclient = self.testClient.getDbConnection() + self.cleanup = [] + return + + def tearDown(self): + try: + #Clean up, terminate the created instance, volumes and snapshots + cleanup_resources(self.apiclient, self.cleanup) + except Exception as e: + raise Exception("Warning: Exception during cleanup : %s" % e) + return + + @attr(tags = ["advanced", "advancedns", "simulator"]) + def test_01_zones(self): + """Check the status of zones""" + + # Validate the following + # 1. List zones + # 2. Check allocation state is "enabled" or not + + zones = Zone.list( + self.apiclient, + id=self.zone.id, + listall=True + ) + self.assertEqual( + isinstance(zones, list), + True, + "Check if listZones returns a valid response" + ) + for zone in zones: + self.assertEqual( + zone.allocationstate, + 'Enabled', + "Zone allocation state should be enabled" + ) + return + + @attr(tags = ["advanced", "advancedns", "simulator"]) + def test_02_pods(self): + """Check the status of pods""" + + # Validate the following + # 1. List pods + # 2. Check allocation state is "enabled" or not + + pods = Pod.list( + self.apiclient, + zoneid=self.zone.id, + listall=True + ) + self.assertEqual( + isinstance(pods, list), + True, + "Check if listPods returns a valid response" + ) + for pod in pods: + self.assertEqual( + pod.allocationstate, + 'Enabled', + "Pods allocation state should be enabled" + ) + return + + @attr(tags = ["advanced", "advancedns", "simulator"]) + def test_03_clusters(self): + """Check the status of clusters""" + + # Validate the following + # 1. List clusters + # 2. Check allocation state is "enabled" or not + + clusters = Cluster.list( + self.apiclient, + zoneid=self.zone.id, + listall=True + ) + self.assertEqual( + isinstance(clusters, list), + True, + "Check if listClusters returns a valid response" + ) + for cluster in clusters: + self.assertEqual( + cluster.allocationstate, + 'Enabled', + "Clusters allocation state should be enabled" + ) + return + + @attr(tags = ["advanced", "advancedns", "simulator"]) + def test_04_hosts(self): + """Check the status of hosts""" + + # Validate the following + # 1. List hosts with type=Routing + # 2. Check state is "Up" or not + + hosts = Host.list( + self.apiclient, + zoneid=self.zone.id, + type='Routing', + listall=True + ) + self.assertEqual( + isinstance(hosts, list), + True, + "Check if listHosts returns a valid response" + ) + for host in hosts: + self.assertEqual( + host.state, + 'Up', + "Host should be in Up state and running" + ) + return + + @attr(tags = ["advanced", "advancedns", "simulator"]) + def test_05_storage_pools(self): + """Check the status of Storage pools""" + + # Validate the following + # 1. List storage pools for the zone + # 2. Check state is "enabled" or not + + storage_pools = StoragePool.list( + self.apiclient, + zoneid=self.zone.id, + listall=True + ) + self.assertEqual( + isinstance(storage_pools, list), + True, + "Check if listStoragePools returns a valid response" + ) + for storage_pool in storage_pools: + self.assertEqual( + storage_pool.state, + 'Up', + "storage pool should be in Up state and running" + ) + return + + @attr(tags = ["advanced", "advancedns", "simulator"]) + def test_06_secondary_storage(self): + """Check the status of secondary storage""" + + # Validate the following + # 1. List secondary storage + # 2. Check state is "Up" or not + + sec_storages = Host.list( + self.apiclient, + zoneid=self.zone.id, + type='SecondaryStorageVM', + listall=True + ) + self.assertEqual( + isinstance(sec_storages, list), + True, + "Check if listHosts returns a valid response" + ) + for sec_storage in sec_storages: + self.assertEqual( + sec_storage.state, + 'Up', + "Secondary storage should be in Up state" + ) + return From b3c88f759455f3e0ece0de8ff0a1904cb4c94cec Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Mon, 20 Aug 2012 11:03:22 +0530 Subject: [PATCH 26/28] Adding more classifications - maintenance (host goes to maitnenance) - multihost, multizone, multistorage --- test/integration/component/test_accounts.py | 9 +- .../component/test_blocker_bugs.py | 10 +- .../component/test_egress_rules.py | 10 +- test/integration/component/test_eip_elb.py | 13 +- .../component/test_high_availability.py | 9 +- .../component/test_host_high_availability.py | 22 +- .../component/test_netscaler_configs.py | 5 +- .../component/test_netscaler_lb.py | 5 +- .../component/test_netscaler_lb_algo.py | 3 +- .../component/test_netscaler_lb_sticky.py | 3 +- .../component/test_netscaler_nw_off.py | 8 +- .../component/test_network_offering.py | 7 +- .../component/test_project_configs.py | 36 +-- .../component/test_project_limits.py | 23 +- .../component/test_project_resources.py | 18 +- .../component/test_project_usage.py | 24 +- test/integration/component/test_projects.py | 29 +-- .../component/test_resource_limits.py | 220 ++---------------- test/integration/component/test_routers.py | 12 +- .../component/test_security_groups.py | 7 +- .../test_security_keys_encryption.py | 7 +- test/integration/component/test_snapshots.py | 16 +- test/integration/component/test_stopped_vm.py | 9 +- test/integration/component/test_templates.py | 12 +- .../component/test_upload_volumes.py | 11 +- test/integration/component/test_usage.py | 24 +- test/integration/component/test_vmware_drs.py | 9 +- test/integration/component/test_volumes.py | 7 +- 28 files changed, 217 insertions(+), 351 deletions(-) diff --git a/test/integration/component/test_accounts.py b/test/integration/component/test_accounts.py index 4c08f8ad863..52ff10a3aa6 100644 --- a/test/integration/component/test_accounts.py +++ b/test/integration/component/test_accounts.py @@ -20,6 +20,7 @@ from integration.lib.utils import * from integration.lib.base import * from integration.lib.common import * from marvin.remoteSSHClient import remoteSSHClient +from nose.plugins.attrib import attr import datetime @@ -39,7 +40,7 @@ class Services: "username": "test", # Random characters are appended for unique # username - "password": "fr3sca", + "password": "password", }, "user": { "email": "user@test.com", @@ -48,7 +49,7 @@ class Services: "username": "User", # Random characters are appended for unique # username - "password": "fr3sca", + "password": "password", }, "service_offering": { "name": "Tiny Instance", @@ -72,7 +73,7 @@ class Services: "template": { "displaytext": "Public Template", "name": "Public template", - "ostypeid": 'aaf6e8c9-b609-441d-9ebd-b4eaa030a275', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', "url": "http://download.cloud.com/releases/2.0.0/UbuntuServer-10-04-64bit.vhd.bz2", "hypervisor": 'XenServer', "format": 'VHD', @@ -80,7 +81,7 @@ class Services: "ispublic": True, "isextractable": True, }, - "ostypeid": 'aaf6e8c9-b609-441d-9ebd-b4eaa030a275', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', # Cent OS 5.3 (64 bit) "sleep": 60, "timeout": 10, diff --git a/test/integration/component/test_blocker_bugs.py b/test/integration/component/test_blocker_bugs.py index 08747a99f9c..fd9c1a4ee79 100644 --- a/test/integration/component/test_blocker_bugs.py +++ b/test/integration/component/test_blocker_bugs.py @@ -14,6 +14,7 @@ """ Tests for Blocker bugs """ import marvin +from nose.plugins.attrib import attr from integration.lib.base import * from integration.lib.utils import * from integration.lib.common import * @@ -40,7 +41,7 @@ class Services: "username": "test", # Random characters are appended for unique # username - "password": "fr3sca", + "password": "password", }, "service_offering": { "name": "Tiny Instance", @@ -72,7 +73,7 @@ class Services: "templates": { "displaytext": 'Template from snapshot', "name": 'Template from snapshot', - "ostypeid": '144f66aa-7f74-4cfe-9799-80cc21439cb3', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', "templatefilter": 'self', "url": "http://download.cloud.com/releases/2.0.0/UbuntuServer-10-04-64bit.vhd.bz2", "hypervisor": 'XenServer', @@ -94,7 +95,7 @@ class Services: "endport": 22, "protocol": "TCP" }, - "ostypeid": '144f66aa-7f74-4cfe-9799-80cc21439cb3', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', # Cent OS 5.3 (64 bit) "sleep": 60, "mode": 'advanced', @@ -1068,6 +1069,7 @@ class TestTemplates(cloudstackTestCase): return + @attr(speed = "slow") @attr(tags = ["advanced", "advancedns", "basic", "sg", "eip"]) def test_01_check_template_size(self): """TS_BUG_009-Test the size of template created from root disk @@ -1095,6 +1097,7 @@ class TestTemplates(cloudstackTestCase): ) return + @attr(speed = "slow") @attr(tags = ["advanced", "advancedns", "basic", "sg", "eip"]) def test_02_check_size_snapshotTemplate(self): """TS_BUG_010-Test check size of snapshot and template @@ -1175,6 +1178,7 @@ class TestTemplates(cloudstackTestCase): ) return + @attr(speed = "slow") @attr(tags = ["advanced", "advancedns", "basic", "sg", "eip"]) def test_03_resuse_template_name(self): """TS_BUG_011-Test Reusing deleted template name diff --git a/test/integration/component/test_egress_rules.py b/test/integration/component/test_egress_rules.py index 7f745e73f26..d5e39beb540 100644 --- a/test/integration/component/test_egress_rules.py +++ b/test/integration/component/test_egress_rules.py @@ -16,6 +16,7 @@ """ #Import Local Modules import marvin +from nose.plugins.attrib import attr from marvin.cloudstackTestCase import * from marvin.cloudstackAPI import * from marvin.remoteSSHClient import remoteSSHClient @@ -46,7 +47,7 @@ class Services: "username": "test", # Random characters are appended in create account to # ensure unique username generated each time - "password": "fr3sca", + "password": "password", }, "virtual_machine": { # Create a small virtual machine instance with disk offering @@ -111,10 +112,10 @@ class Services: }, "mgmt_server": { "username": "root", - "password": "fr3sca", + "password": "password", "ipaddress": "192.168.100.21" }, - "ostypeid": '85cb528f-72ed-4df9-ac6a-f6ccf0892ff2', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', # CentOS 5.3 (64-bit) "sleep": 60, "timeout": 10, @@ -2219,7 +2220,8 @@ class TestEgressAfterHostMaintainance(cloudstackTestCase): return - @attr(tags = ["sg", "eip"]) + @attr(speed = "slow") + @attr(tags = ["sg", "eip", "maintenance"]) def test_egress_after_host_maintainance(self): """Test maintenance case for egress """ diff --git a/test/integration/component/test_eip_elb.py b/test/integration/component/test_eip_elb.py index ea9e7d4a058..c5648bad661 100644 --- a/test/integration/component/test_eip_elb.py +++ b/test/integration/component/test_eip_elb.py @@ -16,6 +16,7 @@ """ #Import Local Modules import marvin +from nose.plugins.attrib import attr from marvin.cloudstackTestCase import * from marvin.cloudstackAPI import * from integration.lib.utils import * @@ -77,7 +78,7 @@ class Services: "username": 'nsroot', "password": 'nsroot' }, - "ostypeid": '593341d7-879b-451e-804c-0c01bdea10c1', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', # Cent OS 5.3 (64 bit) "sleep": 60, "timeout": 10, @@ -179,7 +180,7 @@ class TestEIP(cloudstackTestCase): @attr(tags = ["eip"]) - @unittest.skip("skipped") + @unittest.skip("skipped - Framework DB Exception") def test_01_eip_by_deploying_instance(self): """Test EIP by deploying an instance """ @@ -347,7 +348,7 @@ class TestEIP(cloudstackTestCase): return @attr(tags = ["eip"]) - @unittest.skip("skipped") + @unittest.skip("skipped - Framework DB Exception") def test_02_acquire_ip_enable_static_nat(self): """Test associate new IP and enable static NAT for new IP and the VM """ @@ -492,7 +493,7 @@ class TestEIP(cloudstackTestCase): return @attr(tags = ["eip"]) - @unittest.skip("skipped") + @unittest.skip("skipped - Framework DB Exception") def test_03_disable_static_nat(self): """Test disable static NAT and release EIP acquired """ @@ -692,7 +693,7 @@ class TestEIP(cloudstackTestCase): return @attr(tags = ["eip"]) - @unittest.skip("skipped") + @unittest.skip("skipped - Framework DB Exception") def test_04_disable_static_nat_system(self): """Test disable static NAT with system = True """ @@ -762,7 +763,7 @@ class TestEIP(cloudstackTestCase): return @attr(tags = ["eip"]) - @unittest.skip("skipped") + @unittest.skip("skipped - Framework DB Exception") def test_05_destroy_instance(self): """Test EIO after destroying instance """ diff --git a/test/integration/component/test_high_availability.py b/test/integration/component/test_high_availability.py index 2376d61d5b7..5d7a1747f29 100644 --- a/test/integration/component/test_high_availability.py +++ b/test/integration/component/test_high_availability.py @@ -16,6 +16,7 @@ """ #Import Local Modules import marvin +from nose.plugins.attrib import attr from marvin.cloudstackTestCase import * from marvin.cloudstackAPI import * from integration.lib.utils import * @@ -80,7 +81,7 @@ class Services: "templates": { "displaytext": "Public Template", "name": "Public template", - "ostypeid": '1d4a6dce-8db1-4c08-8752-e88b360d8287', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', "url": "http://download.cloud.com/releases/2.0.0/UbuntuServer-10-04-64bit.vhd.bz2", "hypervisor": 'XenServer', "format": 'VHD', @@ -89,7 +90,7 @@ class Services: "isextractable": True, "templatefilter": 'self', }, - "ostypeid": '1d4a6dce-8db1-4c08-8752-e88b360d8287', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', # Cent OS 5.3 (64 bit) "sleep": 60, "timeout": 100, @@ -169,7 +170,7 @@ class TestHighAvailability(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "advancedns"]) + @attr(tags = ["advanced", "advancedns", "multihost"]) def test_01_host_maintenance_mode(self): """Test host maintenance mode """ @@ -560,7 +561,7 @@ class TestHighAvailability(cloudstackTestCase): ) return - @attr(tags = ["advanced", "advancedns"]) + @attr(tags = ["advanced", "advancedns", "multihost"]) def test_02_host_maintenance_mode_with_activities(self): """Test host maintenance mode with activities """ diff --git a/test/integration/component/test_host_high_availability.py b/test/integration/component/test_host_high_availability.py index fd1dd28e5bf..7adf4078246 100644 --- a/test/integration/component/test_host_high_availability.py +++ b/test/integration/component/test_host_high_availability.py @@ -16,6 +16,7 @@ """ #Import Local Modules import marvin +from nose.plugins.attrib import attr from marvin.cloudstackTestCase import * from marvin.cloudstackAPI import * from integration.lib.utils import * @@ -65,7 +66,7 @@ class Services: "publicport": 22, "protocol": 'TCP', }, - "ostypeid": '6a6b23aa-5e59-4b53-8161-0ad1aa5990f1', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', "timeout": 100, } @@ -146,7 +147,7 @@ class TestHostHighAvailability(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - + @attr(configuration = "ha.tag") @attr(tags = ["advanced", "advancedns", "sg", "basic", "eip", "simulator"]) def test_01_vm_deployment_with_compute_offering_with_ha_enabled(self): """ Test VM deployments (Create HA enabled Compute Service Offering and VM) """ @@ -211,7 +212,8 @@ class TestHostHighAvailability(cloudstackTestCase): "VM not created with HA enable tag" ) - @attr(tags = ["advanced", "advancedns", "sg", "basic", "eip", "simulator"]) + @attr(configuration = "ha.tag") + @attr(tags = ["advanced", "advancedns", "sg", "basic", "eip", "simulator", "multihost"]) def test_02_no_vm_creation_on_host_with_haenabled(self): """ Verify you can not create new VMs on hosts with an ha.tag """ @@ -335,7 +337,8 @@ class TestHostHighAvailability(cloudstackTestCase): "VM migrated to HA enabled host." ) - @attr(tags = ["advanced", "advancedns", "sg", "basic", "eip", "simulator"]) + @attr(configuration = "ha.tag") + @attr(tags = ["advanced", "advancedns", "sg", "basic", "eip", "simulator", "multihost"]) def test_03_cant_migrate_vm_to_host_with_ha_positive(self): """ Verify you can not migrate VMs to hosts with an ha.tag (positive) """ @@ -440,7 +443,8 @@ class TestHostHighAvailability(cloudstackTestCase): "The VM is not migrated to targeted suitable host." ) - @attr(tags = ["advanced", "advancedns", "sg", "basic", "eip", "simulator"]) + @attr(configuration = "ha.tag") + @attr(tags = ["advanced", "advancedns", "sg", "basic", "eip", "simulator", "multihost"]) def test_04_cant_migrate_vm_to_host_with_ha_negative(self): """ Verify you can not migrate VMs to hosts with an ha.tag (negative) """ @@ -544,7 +548,9 @@ class TestHostHighAvailability(cloudstackTestCase): "The detination host id of migrated VM is not matching." ) - @attr(tags = ["advanced", "advancedns", "sg", "basic", "eip", "simulator"]) + @attr(configuration = "ha.tag") + @attr(speed = "slow") + @attr(tags = ["advanced", "advancedns", "sg", "basic", "eip", "simulator", "multihost"]) def test_05_no_vm_with_ha_gets_migrated_to_ha_host_in_live_migration(self): """ Verify that none of the VMs with HA enabled migrate to an ha tagged host during live migration """ @@ -674,7 +680,9 @@ class TestHostHighAvailability(cloudstackTestCase): cmd.id = vm_with_ha_enabled.hostid self.apiclient.cancelHostMaintenance(cmd) - @attr(tags = ["advanced", "advancedns", "sg", "basic", "eip", "simulator"]) + @attr(configuration = "ha.tag") + @attr(speed = "slow") + @attr(tags = ["advanced", "advancedns", "sg", "basic", "eip", "simulator", "multihost"]) def test_06_no_vm_without_ha_gets_migrated_to_ha_host_in_live_migration(self): """ Verify that none of the VMs without HA enabled migrate to an ha tagged host during live migration """ diff --git a/test/integration/component/test_netscaler_configs.py b/test/integration/component/test_netscaler_configs.py index 24083028f17..a5d282be2c6 100644 --- a/test/integration/component/test_netscaler_configs.py +++ b/test/integration/component/test_netscaler_configs.py @@ -16,6 +16,7 @@ """ #Import Local Modules import marvin +from nose.plugins.attrib import attr from marvin.cloudstackTestCase import * from marvin.cloudstackAPI import * from integration.lib.utils import * @@ -38,7 +39,7 @@ class Services: "username": "test", # Random characters are appended for unique # username - "password": "fr3sca", + "password": "password", }, "service_offering": { "name": "Tiny Instance", @@ -140,7 +141,7 @@ class Services: "publicport": 22, "openfirewall": False, }, - "ostypeid": '946b031b-0e10-4f4a-a3fc-d212ae2ea07f', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', # Cent OS 5.3 (64 bit) "sleep": 60, "timeout": 10, diff --git a/test/integration/component/test_netscaler_lb.py b/test/integration/component/test_netscaler_lb.py index 3e3753f5a6d..22433378b1a 100644 --- a/test/integration/component/test_netscaler_lb.py +++ b/test/integration/component/test_netscaler_lb.py @@ -16,6 +16,7 @@ """ #Import Local Modules import marvin +from nose.plugins.attrib import attr from marvin.cloudstackTestCase import * from marvin.cloudstackAPI import * from integration.lib.utils import * @@ -134,7 +135,7 @@ class Services: "publicport": 22, "protocol": "TCP" }, - "ostypeid": '2b58909b-7d9e-45d9-80d8-e58d0bbcbf07', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', # Cent OS 5.3 (64 bit) "sleep": 60, "timeout": 10, @@ -2624,7 +2625,7 @@ class TestVmWithLb(cloudstackTestCase): (self.services["netscaler"]["ipaddress"], e)) return - @attr(tags = ["advancedns"]) + @attr(tags = ["advancedns", "multihost"]) def test_04_migrate_user_vm(self): """Test migrate user VM with LB""" diff --git a/test/integration/component/test_netscaler_lb_algo.py b/test/integration/component/test_netscaler_lb_algo.py index 24ab66c3e9f..5f69564d3a8 100644 --- a/test/integration/component/test_netscaler_lb_algo.py +++ b/test/integration/component/test_netscaler_lb_algo.py @@ -16,6 +16,7 @@ """ #Import Local Modules import marvin +from nose.plugins.attrib import attr from marvin.cloudstackTestCase import * from marvin.cloudstackAPI import * from integration.lib.utils import * @@ -100,7 +101,7 @@ class Services: "publicport": 22, "openfirewall": False, }, - "ostypeid": '946b031b-0e10-4f4a-a3fc-d212ae2ea07f', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', # Cent OS 5.3 (64 bit) "sleep": 60, "timeout": 10, diff --git a/test/integration/component/test_netscaler_lb_sticky.py b/test/integration/component/test_netscaler_lb_sticky.py index e3f02da3bbc..008fef8643c 100644 --- a/test/integration/component/test_netscaler_lb_sticky.py +++ b/test/integration/component/test_netscaler_lb_sticky.py @@ -16,6 +16,7 @@ """ #Import Local Modules import marvin +from nose.plugins.attrib import attr from marvin.cloudstackTestCase import * from marvin.cloudstackAPI import * from integration.lib.utils import * @@ -100,7 +101,7 @@ class Services: "publicport": 22, "openfirewall": False, }, - "ostypeid": '946b031b-0e10-4f4a-a3fc-d212ae2ea07f', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', # Cent OS 5.3 (64 bit) "sleep": 60, "timeout": 10, diff --git a/test/integration/component/test_netscaler_nw_off.py b/test/integration/component/test_netscaler_nw_off.py index d57b4bb753c..9cf97dbb93f 100644 --- a/test/integration/component/test_netscaler_nw_off.py +++ b/test/integration/component/test_netscaler_nw_off.py @@ -16,6 +16,7 @@ """ #Import Local Modules import marvin +from nose.plugins.attrib import attr from marvin.cloudstackTestCase import * from marvin.cloudstackAPI import * from integration.lib.utils import * @@ -38,7 +39,7 @@ class Services: "username": "test", # Random characters are appended for unique # username - "password": "fr3sca", + "password": "password", }, "service_offering": { "name": "Tiny Instance", @@ -153,7 +154,7 @@ class Services: "publicport": 22, "openfirewall": False, }, - "ostypeid": '946b031b-0e10-4f4a-a3fc-d212ae2ea07f', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', # Cent OS 5.3 (64 bit) "sleep": 60, "timeout": 10, @@ -359,7 +360,7 @@ class TestAddMultipleNSDiffZone(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advancedns"]) + @attr(tags = ["advancedns", "multizone"]) def test_add_mul_netscaler_diff_zone(self): """Test add netscaler devices in different zones """ @@ -989,6 +990,7 @@ class TestNetScalerSharedMode(cloudstackTestCase): self.debug("Deploy VM failed as Netscaler device capacity is full!") return + @attr(configuration = "network.gc") @attr(tags = ["advancedns"]) def test_04_delete_account_after_capacity_full(self): """Test delete and add resouces after netscaler device capacity is full diff --git a/test/integration/component/test_network_offering.py b/test/integration/component/test_network_offering.py index b351de355af..66850e2feee 100644 --- a/test/integration/component/test_network_offering.py +++ b/test/integration/component/test_network_offering.py @@ -16,6 +16,7 @@ """ #Import Local Modules import marvin +from nose.plugins.attrib import attr from marvin.cloudstackTestCase import * from marvin.cloudstackAPI import * from integration.lib.utils import * @@ -38,7 +39,7 @@ class Services: "username": "test", # Random characters are appended for unique # username - "password": "fr3sca", + "password": "password", }, "service_offering": { "name": "Tiny Instance", @@ -133,7 +134,7 @@ class Services: "publicport": 22, "protocol": 'TCP', }, - "ostypeid": '9958b10f-9e5d-4ef1-908d-a047372d823b', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', # Cent OS 5.3 (64 bit) "sleep": 60, "timeout": 10, @@ -1428,6 +1429,7 @@ class TestNetworkUpgrade(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(speed = "slow") @attr(tags = ["advancedns"]) def test_01_nwupgrade_netscaler_conserve_on(self): """Test Nw upgrade to netscaler lb service and conserve mode ON @@ -1627,6 +1629,7 @@ class TestNetworkUpgrade(cloudstackTestCase): ) return + @attr(speed = "slow") @attr(tags = ["advancedns"]) def test_02_nwupgrade_netscaler_conserve_off(self): """Test Nw upgrade to netscaler lb service and conserve mode OFF diff --git a/test/integration/component/test_project_configs.py b/test/integration/component/test_project_configs.py index 9272250abfe..545f8ee3274 100644 --- a/test/integration/component/test_project_configs.py +++ b/test/integration/component/test_project_configs.py @@ -15,6 +15,7 @@ """ #Import Local Modules import marvin +from nose.plugins.attrib import attr from marvin.cloudstackTestCase import * from marvin.cloudstackAPI import * from integration.lib.utils import * @@ -40,7 +41,7 @@ class Services: "mgmt_server": { "ipaddress": '192.168.100.21', "username": 'root', - "password": 'fr3sca', + "password": 'password', "port": 22, }, "account": { @@ -50,7 +51,7 @@ class Services: "username": "test", # Random characters are appended for unique # username - "password": "fr3sca", + "password": "password", }, "user": { "email": "administrator@clogeny.com", @@ -59,7 +60,7 @@ class Services: "username": "User", # Random characters are appended for unique # username - "password": "fr3sca", + "password": "password", }, "service_offering": { "name": "Tiny Instance", @@ -83,7 +84,7 @@ class Services: "template": { "displaytext": "Public Template", "name": "Public template", - "ostypeid": '7ddbbbb5-bb09-40de-b038-ee78995788ea', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', "url": "http://download.cloud.com/releases/2.0.0/UbuntuServer-10-04-64bit.vhd.bz2", "hypervisor": 'XenServer', "format": 'VHD', @@ -94,7 +95,7 @@ class Services: "configs": { "project.invite.timeout": 300, }, - "ostypeid": '7ddbbbb5-bb09-40de-b038-ee78995788ea', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', # Cent OS 5.3 (64 bit) "sleep": 60, "timeout": 10, @@ -170,7 +171,8 @@ class TestUserProjectCreation(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) + @attr(configuration = "allow.user.create.projects") + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns", "simulator"]) def test_admin_project_creation(self): """Test create project as a domain admin and domain user """ @@ -318,7 +320,8 @@ class TestProjectCreationNegative(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) + @attr(configuration = "allow.user.create.projects") + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns", "simulator"]) @unittest.skip("Known bug-able to create project as a domain user") def test_user_project_creation(self): """Test create project as a domain admin and domain user @@ -443,7 +446,7 @@ class TestProjectInviteRequired(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns", "simulator"]) def test_add_user_to_project(self): """Add user to project when 'project.invite.required' is false""" @@ -595,10 +598,11 @@ class TestProjectInviteRequiredTrue(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(configuration = "project.invite.required") + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) def test_add_user_to_project(self): """Add user to project when 'project.invite.required' is true""" - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following: # 1. Create a Project @@ -759,10 +763,11 @@ class TestProjectInviteTimeout(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(configuration = "project.invite.timeout") + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns", "simulator"]) def test_01_invitation_timeout(self): """Test global config project invitation timeout""" - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following: # 1. Set configuration to 5 mins @@ -884,10 +889,11 @@ class TestProjectInviteTimeout(cloudstackTestCase): ) return + @attr(configuration = "project.invite.timeout") + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns", "simulator"]) def test_02_invitation_timeout_after_expiry(self): """Test global config project invitation timeout""" - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following: # 1. Set configuration to 5 mins @@ -1014,11 +1020,11 @@ class TestProjectInviteTimeout(cloudstackTestCase): ) return + @attr(configuration = "project.invite.timeout") + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns", "simulator"]) def test_03_invite_after_expiry(self): """Test global config project invitation timeout""" - tags = ["advanced", "basic", "sg", "eip", "advancedns"] - # Validate the following: # 1. Set configuration to 5 mins # 2. Create a Project @@ -1143,11 +1149,11 @@ class TestProjectInviteTimeout(cloudstackTestCase): ) return + @attr(configuration = "project.invite.timeout") + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns", "simulator"]) def test_04_decline_invitation(self): """Test decline invitation""" - tags = ["advanced", "basic", "sg", "eip", "advancedns"] - # Validate the following: # 1. Set configuration to 5 mins # 2. Create a Project diff --git a/test/integration/component/test_project_limits.py b/test/integration/component/test_project_limits.py index 917595e7166..f4a99e1bba4 100644 --- a/test/integration/component/test_project_limits.py +++ b/test/integration/component/test_project_limits.py @@ -15,6 +15,7 @@ """ #Import Local Modules import marvin +from nose.plugins.attrib import attr from marvin.cloudstackTestCase import * from marvin.cloudstackAPI import * from integration.lib.utils import * @@ -43,7 +44,7 @@ class Services: "username": "test", # Random characters are appended for unique # username - "password": "fr3sca", + "password": "password", }, "user": { "email": "administrator@clogeny.com", @@ -52,7 +53,7 @@ class Services: "username": "User", # Random characters are appended for unique # username - "password": "fr3sca", + "password": "password", }, "service_offering": { "name": "Tiny Instance", @@ -82,10 +83,10 @@ class Services: "template": { "displaytext": "Cent OS Template", "name": "Cent OS Template", - "ostypeid": '471a4b5b-5523-448f-9608-7d6218995733', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', "templatefilter": 'self', }, - "ostypeid": '471a4b5b-5523-448f-9608-7d6218995733', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', # Cent OS 5.3 (64 bit) "sleep": 60, "timeout": 10, @@ -152,7 +153,7 @@ class TestProjectLimits(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns", "simulator"]) def test_01_project_limits(self): """ Test project limits """ @@ -299,7 +300,7 @@ class TestProjectLimits(cloudstackTestCase): ) return - @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns", "simulator"]) @unittest.skip("No provision for updating resource limits from account through API") def test_02_project_limits_normal_user(self): """ Test project limits @@ -523,7 +524,7 @@ class TestResourceLimitsProject(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns", "simulator"]) def test_03_vm_per_project(self): """Test VM limit per project """ @@ -585,10 +586,10 @@ class TestResourceLimitsProject(cloudstackTestCase): ) return + @attr(tags = ["advanced", "eip", "advancedns", "simulator"]) def test_04_publicip_per_project(self): """Test Public IP limit per project """ - tags = ["advanced", "eip", "advancedns"] # Validate the following # 1. set max no of IPs per project to 2. # 2. Create an account in this domain @@ -670,10 +671,10 @@ class TestResourceLimitsProject(cloudstackTestCase): ) return + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns", "simulator"]) def test_05_snapshots_per_project(self): """Test Snapshot limit per project """ - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following # 1. set max no of snapshots per project to 1. # 2. Create one snapshot in the project. Snapshot should be @@ -747,10 +748,10 @@ class TestResourceLimitsProject(cloudstackTestCase): ) return + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns", "simulator"]) def test_06_volumes_per_project(self): """Test Volumes limit per project """ - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following # 1. set max no of volume per project to 1. # 2. Create 1 VM in this project @@ -796,10 +797,10 @@ class TestResourceLimitsProject(cloudstackTestCase): ) return + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) def test_07_templates_per_project(self): """Test Templates limit per project """ - tags = ["advanced", "basic", "sg", "eip", "advancedns"] # Validate the following # 1. set max no of templates per project to 1. # 2. Create a template in this project. Both template should be in diff --git a/test/integration/component/test_project_resources.py b/test/integration/component/test_project_resources.py index 835b021a154..86b902815dc 100644 --- a/test/integration/component/test_project_resources.py +++ b/test/integration/component/test_project_resources.py @@ -15,6 +15,7 @@ """ #Import Local Modules import marvin +from nose.plugins.attrib import attr from marvin.cloudstackTestCase import * from marvin.cloudstackAPI import * from integration.lib.utils import * @@ -44,7 +45,7 @@ class Services: "username": "test", # Random characters are appended for unique # username - "password": "fr3sca", + "password": "password", }, "user": { "email": "administrator@clogeny.com", @@ -53,7 +54,7 @@ class Services: "username": "User", # Random characters are appended for unique # username - "password": "fr3sca", + "password": "password", }, "service_offering": { "name": "Tiny Instance", @@ -83,7 +84,7 @@ class Services: "template": { "displaytext": "Cent OS Template", "name": "Cent OS Template", - "ostypeid": '5776c0d2-f331-42db-ba3a-29f1f8319bc9', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', "templatefilter": 'self', "ispublic": False, }, @@ -126,7 +127,7 @@ class Services: "endport": 22, "cidrlist": '0.0.0.0/0', }, - "ostypeid": '5776c0d2-f331-42db-ba3a-29f1f8319bc9', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', # Cent OS 5.3 (64 bit) "sleep": 60, "timeout": 10, @@ -203,7 +204,7 @@ class TestOfferings(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns", "simulator"]) def test_01_service_offerings(self): """ Test service offerings in a project """ @@ -245,7 +246,7 @@ class TestOfferings(cloudstackTestCase): return - @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns", "simulator"]) def test_02_project_disk_offerings(self): """ Test project disk offerings """ @@ -377,7 +378,7 @@ class TestNetwork(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "advancedns"]) + @attr(tags = ["advanced", "advancedns", "simulator"]) def test_03_network_create(self): """ Test create network in project """ @@ -806,7 +807,8 @@ class TestSnapshots(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) + @attr(speed = "slow") + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns", "simulator"]) def test_06_create_snapshots_in_project(self): """Test create snapshots in project """ diff --git a/test/integration/component/test_project_usage.py b/test/integration/component/test_project_usage.py index f1f70ccf562..8a6d4d1439d 100644 --- a/test/integration/component/test_project_usage.py +++ b/test/integration/component/test_project_usage.py @@ -15,6 +15,7 @@ """ #Import Local Modules import marvin +from nose.plugins.attrib import attr from marvin.cloudstackTestCase import * from marvin.cloudstackAPI import * from integration.lib.utils import * @@ -37,7 +38,7 @@ class Services: "username": "test", # Random characters are appended for unique # username - "password": "fr3sca", + "password": "password", }, "project": { "name": "Project", @@ -71,7 +72,7 @@ class Services: "templates": { "displaytext": 'Template', "name": 'Template', - "ostypeid": '471a4b5b-5523-448f-9608-7d6218995733', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', "templatefilter": 'self', "url": "http://download.cloud.com/releases/2.0.0/UbuntuServer-10-04-64bit.qcow2.bz2" }, @@ -83,7 +84,7 @@ class Services: "isextractable": True, "isfeatured": True, "ispublic": True, - "ostypeid": '471a4b5b-5523-448f-9608-7d6218995733', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', }, "lbrule": { "name": "SSH", @@ -101,7 +102,7 @@ class Services: "username": "test", "password": "test", }, - "ostypeid": '471a4b5b-5523-448f-9608-7d6218995733', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', # Cent OS 5.3 (64 bit) "sleep": 60, "timeout": 10, @@ -188,7 +189,7 @@ class TestVmUsage(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns", "simulator"]) def test_01_vm_usage(self): """Test Create/Destroy VM and verify usage calculation """ @@ -399,7 +400,7 @@ class TestPublicIPUsage(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "eip", "advancedns"]) + @attr(tags = ["advanced", "eip", "advancedns", "simulator"]) def test_01_public_ip_usage(self): """Test Assign new IP and verify usage calculation """ @@ -557,7 +558,7 @@ class TestVolumeUsage(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns", "simulator"]) def test_01_volume_usage(self): """Test Create/delete a volume and verify correct usage is recorded """ @@ -1072,7 +1073,7 @@ class TestLBRuleUsage(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "eip", "advancedns"]) + @attr(tags = ["advanced", "eip", "advancedns", "simulator"]) def test_01_lb_usage(self): """Test Create/Delete a LB rule and verify correct usage is recorded """ @@ -1238,7 +1239,8 @@ class TestSnapshotUsage(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) + @attr(speed = "slow") + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns", "simulator"]) def test_01_snapshot_usage(self): """Test Create/Delete a manual snap shot and verify correct usage is recorded @@ -1430,7 +1432,7 @@ class TestNatRuleUsage(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "advancedns"]) + @attr(tags = ["advanced", "advancedns", "simulator"]) def test_01_nat_usage(self): """Test Create/Delete a PF rule and verify correct usage is recorded """ @@ -1613,7 +1615,7 @@ class TestVpnUsage(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "advancedns"]) + @attr(tags = ["advanced", "advancedns", "simulator"]) def test_01_vpn_usage(self): """Test Create/Delete a VPN and verify correct usage is recorded """ diff --git a/test/integration/component/test_projects.py b/test/integration/component/test_projects.py index 5eee677c432..d2922d5d7d1 100644 --- a/test/integration/component/test_projects.py +++ b/test/integration/component/test_projects.py @@ -15,6 +15,7 @@ """ #Import Local Modules import marvin +from nose.plugins.attrib import attr from marvin.cloudstackTestCase import * from marvin.cloudstackAPI import * from integration.lib.utils import * @@ -40,7 +41,7 @@ class Services: "mgmt_server": { "ipaddress": '192.168.100.21', "username": 'root', - "password": 'fr3sca', + "password": 'password', "port": 22, }, "account": { @@ -50,7 +51,7 @@ class Services: "username": "test", # Random characters are appended for unique # username - "password": "fr3sca", + "password": "password", }, "user": { "email": "administrator@clogeny.com", @@ -59,7 +60,7 @@ class Services: "username": "User", # Random characters are appended for unique # username - "password": "fr3sca", + "password": "password", }, "disk_offering": { "displaytext": "Tiny Disk Offering", @@ -88,7 +89,7 @@ class Services: "publicport": 22, "protocol": 'TCP', }, - "ostypeid": '7ddbbbb5-bb09-40de-b038-ee78995788ea', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', # Cent OS 5.3 (64 bit) "sleep": 60, "timeout": 10, @@ -164,7 +165,7 @@ class TestMultipleProjectCreation(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns", "simulator"]) def test_01_create_multiple_projects_by_account(self): """ Verify an account can own multiple projects and can belong to multiple projects @@ -380,7 +381,7 @@ class TestCrossDomainAccountAdd(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns", "simulator"]) def test_02_cross_domain_account_add(self): """ Verify No cross domain projects """ @@ -500,7 +501,7 @@ class TestDeleteAccountWithProject(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns", "simulator"]) def test_03_delete_account_with_project(self): """ Test As long as the project exists, its owner can't be removed """ @@ -614,7 +615,7 @@ class TestDeleteDomainWithProject(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns", "simulator"]) def test_04_delete_domain_with_project(self): """ Test Verify delete domain with cleanup=true should delete projects belonging to the domain @@ -759,7 +760,7 @@ class TestProjectOwners(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns", "simulator"]) def test_05_user_project_owner_promotion(self): """ Test Verify a project user can be later promoted to become a owner @@ -901,7 +902,7 @@ class TestProjectOwners(cloudstackTestCase): ) return - @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns", "simulator"]) def test_06_max_one_project_owner(self): """ Test Verify there can only be one owner of a project at a time """ @@ -1191,7 +1192,7 @@ class TestProjectResources(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns", "simulator"]) def test_07_project_resources_account_delete(self): """ Test Verify after an account is removed from the project, all his resources stay with the project. @@ -1307,7 +1308,7 @@ class TestProjectResources(cloudstackTestCase): ) return - @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns", "simulator"]) def test_08_cleanup_after_project_delete(self): """ Test accounts are unassigned from project after project deletion """ @@ -1521,7 +1522,7 @@ class TestProjectSuspendActivate(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns", "simulator"]) def test_09_project_suspend(self): """ Test Verify after an account is removed from the project, all his resources stay with the project. @@ -1658,7 +1659,7 @@ class TestProjectSuspendActivate(cloudstackTestCase): ) return - @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns", "simulator"]) def test_10_project_activation(self): """ Test project activation after suspension """ diff --git a/test/integration/component/test_resource_limits.py b/test/integration/component/test_resource_limits.py index aad83292bfb..b8e3df9e269 100644 --- a/test/integration/component/test_resource_limits.py +++ b/test/integration/component/test_resource_limits.py @@ -15,6 +15,7 @@ """ #Import Local Modules import marvin +from nose.plugins.attrib import attr from marvin.cloudstackTestCase import * from marvin.cloudstackAPI import * from integration.lib.utils import * @@ -39,7 +40,7 @@ class Services: "username": "test", # Random characters are appended for unique # username - "password": "fr3sca", + "password": "password", }, "service_offering": { "name": "Tiny Instance", @@ -69,10 +70,10 @@ class Services: "template": { "displaytext": "Cent OS Template", "name": "Cent OS Template", - "ostypeid": '144f66aa-7f74-4cfe-9799-80cc21439cb3', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', "templatefilter": 'self', }, - "ostypeid": '144f66aa-7f74-4cfe-9799-80cc21439cb3', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', # Cent OS 5.3 (64 bit) "sleep": 60, "timeout": 10, @@ -149,7 +150,7 @@ class TestResourceLimitsAccount(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "advancedns"]) + @attr(tags = ["advanced", "advancedns", "simulator"]) def test_01_vm_per_account(self): """Test VM limit per account """ @@ -242,7 +243,7 @@ class TestResourceLimitsAccount(cloudstackTestCase): ) return - @attr(tags = ["advanced", "advancedns"]) + @attr(tags = ["advanced", "advancedns", "simulator"]) def test_02_publicip_per_account(self): """Test Public IP limit per account """ @@ -385,7 +386,8 @@ class TestResourceLimitsAccount(cloudstackTestCase): ) return - @attr(tags = ["advanced", "advancedns"]) + @attr(speed = "slow") + @attr(tags = ["advanced", "advancedns", "simulator"]) def test_03_snapshots_per_account(self): """Test Snapshot limit per account """ @@ -541,7 +543,7 @@ class TestResourceLimitsAccount(cloudstackTestCase): ) return - @attr(tags = ["advanced", "advancedns"]) + @attr(tags = ["advanced", "advancedns", "simulator"]) def test_04_volumes_per_account(self): """Test Volumes limit per account """ @@ -913,7 +915,7 @@ class TestResourceLimitsDomain(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "advancedns"]) + @attr(tags = ["advanced", "advancedns", "simulator"]) def test_01_vm_per_domain(self): """Test VM limit per domain """ @@ -979,7 +981,7 @@ class TestResourceLimitsDomain(cloudstackTestCase): ) return - @attr(tags = ["advanced", "advancedns"]) + @attr(tags = ["advanced", "advancedns", "simulator"]) def test_01_publicip_per_domain(self): """Test Public IP limit per domain """ @@ -1049,7 +1051,8 @@ class TestResourceLimitsDomain(cloudstackTestCase): ) return - @attr(tags = ["advanced", "advancedns"]) + @attr(speed = "slow") + @attr(tags = ["advanced", "advancedns", "simulator"]) def test_03_snapshots_per_domain(self): """Test Snapshot limit per domain """ @@ -1132,7 +1135,7 @@ class TestResourceLimitsDomain(cloudstackTestCase): ) return - @attr(tags = ["advanced", "advancedns"]) + @attr(tags = ["advanced", "advancedns", "simulator"]) def test_04_volumes_per_domain(self): """Test Volumes limit per domain """ @@ -1294,198 +1297,3 @@ class TestResourceLimitsDomain(cloudstackTestCase): ) return - -class TestResources(cloudstackTestCase): - - @classmethod - def setUpClass(cls): - cls.api_client = super( - TestResources, - cls - ).getClsTestClient().getApiClient() - cls.services = Services().services - # Get Zone, Domain and templates - cls.zone = get_zone(cls.api_client, cls.services) - cls._cleanup = [] - return - - @classmethod - def tearDownClass(cls): - try: - #Cleanup resources used - cleanup_resources(cls.api_client, cls._cleanup) - except Exception as e: - raise Exception("Warning: Exception during cleanup : %s" % e) - return - - def setUp(self): - self.apiclient = self.testClient.getApiClient() - self.dbclient = self.testClient.getDbConnection() - self.cleanup = [] - return - - def tearDown(self): - try: - #Clean up, terminate the created instance, volumes and snapshots - cleanup_resources(self.apiclient, self.cleanup) - except Exception as e: - raise Exception("Warning: Exception during cleanup : %s" % e) - return - - @attr(tags = ["advanced", "advancedns"]) - def test_01_zones(self): - """Check the status of zones""" - - # Validate the following - # 1. List zones - # 2. Check allocation state is "enabled" or not - - zones = Zone.list( - self.apiclient, - id=self.zone.id, - listall=True - ) - self.assertEqual( - isinstance(zones, list), - True, - "Check if listZones returns a valid response" - ) - for zone in zones: - self.assertEqual( - zone.allocationstate, - 'Enabled', - "Zone allocation state should be enabled" - ) - return - - @attr(tags = ["advanced", "advancedns"] - def test_02_pods(self): - """Check the status of pods""" - - # Validate the following - # 1. List pods - # 2. Check allocation state is "enabled" or not - - pods = Pod.list( - self.apiclient, - zoneid=self.zone.id, - listall=True - ) - self.assertEqual( - isinstance(pods, list), - True, - "Check if listPods returns a valid response" - ) - for pod in pods: - self.assertEqual( - pod.allocationstate, - 'Enabled', - "Pods allocation state should be enabled" - ) - return - - @attr(tags = ["advanced", "advancedns"]) - def test_03_clusters(self): - """Check the status of clusters""" - - # Validate the following - # 1. List clusters - # 2. Check allocation state is "enabled" or not - - clusters = Cluster.list( - self.apiclient, - zoneid=self.zone.id, - listall=True - ) - self.assertEqual( - isinstance(clusters, list), - True, - "Check if listClusters returns a valid response" - ) - for cluster in clusters: - self.assertEqual( - cluster.allocationstate, - 'Enabled', - "Clusters allocation state should be enabled" - ) - return - - @attr(tags = ["advanced", "advancedns"]) - def test_04_hosts(self): - """Check the status of hosts""" - - # Validate the following - # 1. List hosts with type=Routing - # 2. Check state is "Up" or not - - hosts = Host.list( - self.apiclient, - zoneid=self.zone.id, - type='Routing', - listall=True - ) - self.assertEqual( - isinstance(hosts, list), - True, - "Check if listHosts returns a valid response" - ) - for host in hosts: - self.assertEqual( - host.state, - 'Up', - "Host should be in Up state and running" - ) - return - - @attr(tags = ["advanced", "advancedns"]) - def test_05_storage_pools(self): - """Check the status of Storage pools""" - - # Validate the following - # 1. List storage pools for the zone - # 2. Check state is "enabled" or not - - storage_pools = StoragePool.list( - self.apiclient, - zoneid=self.zone.id, - listall=True - ) - self.assertEqual( - isinstance(storage_pools, list), - True, - "Check if listStoragePools returns a valid response" - ) - for storage_pool in storage_pools: - self.assertEqual( - storage_pool.state, - 'Up', - "storage pool should be in Up state and running" - ) - return - - @attr(tags = ["advanced", "advancedns"]) - def test_06_secondary_storage(self): - """Check the status of secondary storage""" - - # Validate the following - # 1. List secondary storage - # 2. Check state is "Up" or not - - sec_storages = Host.list( - self.apiclient, - zoneid=self.zone.id, - type='SecondaryStorageVM', - listall=True - ) - self.assertEqual( - isinstance(sec_storages, list), - True, - "Check if listHosts returns a valid response" - ) - for sec_storage in sec_storages: - self.assertEqual( - sec_storage.state, - 'Up', - "Secondary storage should be in Up state" - ) - return diff --git a/test/integration/component/test_routers.py b/test/integration/component/test_routers.py index 1805207b14b..378b1f43ba7 100644 --- a/test/integration/component/test_routers.py +++ b/test/integration/component/test_routers.py @@ -15,6 +15,7 @@ """ #Import Local Modules import marvin +from nose.plugins.attrib import attr from marvin.cloudstackTestCase import * from marvin.cloudstackAPI import * from integration.lib.utils import * @@ -54,7 +55,7 @@ class Services: }, "host": { "username": "root", - "password": "fr3sca", + "password": "password", "publicport": 22, }, "account": { @@ -85,7 +86,7 @@ class Services: "cidr": '55.55.0.0/11', # Any network (For creating FW rule }, - "ostypeid": '5776c0d2-f331-42db-ba3a-29f1f8319bc9', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', # Used for Get_Template : CentOS 5.3 (64 bit) "mode": 'advanced', # Networking mode: Advanced, basic } @@ -310,6 +311,7 @@ class TestRouterServices(cloudstackTestCase): ) return + @attr(configuration = "network.gc") @attr(tags = ["advanced"]) def test_02_NetworkGarbageCollection(self): """Test network garbage collection @@ -643,7 +645,7 @@ class TestRouterStopCreatePF(cloudstackTestCase): self._cleanup = [] return - @attr(tags = ["advanced"]) + @attr(tags = ["advanced", "advancedns"]) def test_01_RouterStopCreatePF(self): """Test router stop create port forwarding """ @@ -853,7 +855,7 @@ class TestRouterStopCreateLB(cloudstackTestCase): self._cleanup = [] return - @attr(tags = ["advanced"]) + @attr(tags = ["advanced", "advancedns"]) def test_01_RouterStopCreateLB(self): """Test router stop create Load balancing """ @@ -1063,7 +1065,7 @@ class TestRouterStopCreateFW(cloudstackTestCase): self._cleanup = [] return - @attr(tags = ["advanced"]) + @attr(tags = ["advanced", "advancedns"]) def test_01_RouterStopCreateFW(self): """Test router stop create Firewall rule """ diff --git a/test/integration/component/test_security_groups.py b/test/integration/component/test_security_groups.py index df4d41b4f01..16b244219c1 100644 --- a/test/integration/component/test_security_groups.py +++ b/test/integration/component/test_security_groups.py @@ -16,6 +16,7 @@ """ #Import Local Modules import marvin +from nose.plugins.attrib import attr from marvin.cloudstackTestCase import * from marvin.cloudstackAPI import * from integration.lib.utils import * @@ -46,7 +47,7 @@ class Services: "username": "test", # Random characters are appended in create account to # ensure unique username generated each time - "password": "fr3sca", + "password": "password", }, "virtual_machine": { # Create a small virtual machine instance with disk offering @@ -63,7 +64,7 @@ class Services: "host": { "publicport": 22, "username": "root", # Host creds for SSH - "password": "fr3sca", + "password": "password", }, "service_offering": { "name": "Tiny Instance", @@ -86,7 +87,7 @@ class Services: "endport": -1, "cidrlist": '0.0.0.0/0', }, - "ostypeid": '0c2c5d19-525b-41be-a8c3-c6607412f82b', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', # CentOS 5.3 (64-bit) "sleep": 60, "timeout": 10, diff --git a/test/integration/component/test_security_keys_encryption.py b/test/integration/component/test_security_keys_encryption.py index d33c2181ec1..4fcfe2903ed 100644 --- a/test/integration/component/test_security_keys_encryption.py +++ b/test/integration/component/test_security_keys_encryption.py @@ -1,6 +1,7 @@ """ P1 tests for Security Keys Encryption """ #Import Local Modules +from nose.plugins.attrib import attr from integration.lib.base import * from integration.lib.common import * from integration.lib.utils import * @@ -24,7 +25,7 @@ class Services: "username": "test", # Random characters are appended for unique # username - "password": "fr3sca", + "password": "password", }, "service_offering": { "name": "Tiny Instance", @@ -49,7 +50,7 @@ class Services: }, "host": { "username": "root", - "password": "fr3sca", + "password": "password", }, "globalconfig": { "security.hash.key" : "test", @@ -70,7 +71,7 @@ class Services: "alert.smtp.password" : "test", "project.smtp.password" : "test", }, - "ostypeid": '7ddbbbb5-bb09-40de-b038-ee78995788ea', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', # Cent OS 5.3 (64 bit) "sleep": 60, "timeout": 10, diff --git a/test/integration/component/test_snapshots.py b/test/integration/component/test_snapshots.py index 95627b6a9cc..d2675108850 100644 --- a/test/integration/component/test_snapshots.py +++ b/test/integration/component/test_snapshots.py @@ -15,6 +15,7 @@ """ #Import Local Modules import marvin +from nose.plugins.attrib import attr from marvin.cloudstackTestCase import * from marvin.cloudstackAPI import * from integration.lib.utils import * @@ -36,7 +37,7 @@ class Services: "username": "test", # Random characters are appended for unique # username - "password": "fr3sca", + "password": "password", }, "service_offering": { "name": "Tiny Instance", @@ -63,7 +64,7 @@ class Services: "mgmt_server": { "ipaddress": '192.168.100.21', "username": "root", - "password": "fr3sca", + "password": "password", "port": 22, }, "recurring_snapshot": { @@ -77,7 +78,7 @@ class Services: "templates": { "displaytext": 'Template', "name": 'Template', - "ostypeid": '7ddbbbb5-bb09-40de-b038-ee78995788ea', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', "templatefilter": 'self', }, "diskdevice": "/dev/xvda", @@ -90,7 +91,7 @@ class Services: "sub_lvl_dir2": "test2", "random_data": "random.data", - "ostypeid": '7ddbbbb5-bb09-40de-b038-ee78995788ea', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', # Cent OS 5.3 (64 bit) "sleep": 60, "timeout": 10, @@ -160,6 +161,7 @@ class TestCreateVMsnapshotTemplate(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(speed = "slow") @attr(tags = ["advanced", "advancedns"]) def test_01_createVM_snapshotTemplate(self): """Test create VM, Snapshot and Template @@ -473,6 +475,7 @@ class TestAccountSnapshotClean(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(speed = "slow") @attr(tags = ["advanced", "advancedns"]) def test_02_accountSnapshotClean(self): """Test snapshot cleanup after account deletion @@ -816,6 +819,7 @@ class TestSnapshotDetachedDisk(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(speed = "slow") @attr(tags = ["advanced", "advancedns"]) def test_03_snapshot_detachedDisk(self): """Test snapshot from detached disk @@ -1095,6 +1099,7 @@ class TestSnapshotLimit(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + @attr(speed = "slow") @attr(tags = ["advanced", "advancedns"]) def test_04_snapshot_limit(self): """Test snapshot limit in snapshot policies @@ -1352,7 +1357,8 @@ class TestSnapshotEvents(cloudstackTestCase): except Exception as e: raise Exception("Warning: Exception during cleanup : %s" % e) return - + + @attr(speed = "slow") @attr(tags = ["advanced", "advancedns"]) def test_05_snapshot_events(self): """Test snapshot events diff --git a/test/integration/component/test_stopped_vm.py b/test/integration/component/test_stopped_vm.py index c256655ebb5..cf6e6c504f4 100644 --- a/test/integration/component/test_stopped_vm.py +++ b/test/integration/component/test_stopped_vm.py @@ -16,6 +16,7 @@ """ #Import Local Modules import marvin +from nose.plugins.attrib import attr from marvin.cloudstackTestCase import * from marvin.cloudstackAPI import * from marvin.remoteSSHClient import remoteSSHClient @@ -74,9 +75,9 @@ class Services: { "displaytext": "Test ISO", "name": "testISO", - "url": "http://nfs1.lab.vmops.com/isos_32bit/dsl-4.4.10.iso", + "url": "http://iso.linuxquestions.org/download/504/1819/http/gd4.tuwien.ac.at/dsl-4.4.10.iso", # Source URL where ISO is located - "ostypeid": '19e6a39f-92db-4d2c-b375-33e7f42d86be', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', "mode": 'HTTP_DOWNLOAD', # Downloading existing ISO }, "template": { @@ -88,14 +89,14 @@ class Services: "isextractable": True, "displaytext": "Cent OS Template", "name": "Cent OS Template", - "ostypeid": '19e6a39f-92db-4d2c-b375-33e7f42d86be', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', "templatefilter": 'self', "passwordenabled": True, }, "sleep": 60, "timeout": 10, #Migrate VM to hostid - "ostypeid": '19e6a39f-92db-4d2c-b375-33e7f42d86be', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', # CentOS 5.3 (64-bit) } diff --git a/test/integration/component/test_templates.py b/test/integration/component/test_templates.py index 0f0614872dd..dbff5ea3f40 100644 --- a/test/integration/component/test_templates.py +++ b/test/integration/component/test_templates.py @@ -15,6 +15,7 @@ """ #Import Local Modules import marvin +from nose.plugins.attrib import attr from marvin.cloudstackTestCase import * from marvin.cloudstackAPI import * from integration.lib.utils import * @@ -40,7 +41,7 @@ class Services: "username": "test", # Random characters are appended for unique # username - "password": "fr3sca", + "password": "password", }, "service_offering": { "name": "Tiny Instance", @@ -73,7 +74,7 @@ class Services: 0: { "displaytext": "Public Template", "name": "Public template", - "ostypeid": '5776c0d2-f331-42db-ba3a-29f1f8319bc9', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', "url": "http://download.cloud.com/releases/2.0.0/UbuntuServer-10-04-64bit.vhd.bz2", "hypervisor": 'XenServer', "format": 'VHD', @@ -85,12 +86,12 @@ class Services: "template": { "displaytext": "Cent OS Template", "name": "Cent OS Template", - "ostypeid": '5776c0d2-f331-42db-ba3a-29f1f8319bc9', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', "templatefilter": 'self', }, "templatefilter": 'self', "destzoneid": 2, # For Copy template (Destination zone) - "ostypeid": '5776c0d2-f331-42db-ba3a-29f1f8319bc9', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', "sleep": 60, "timeout": 10, "mode": 'advanced', # Networking mode: Advanced, basic @@ -412,7 +413,7 @@ class TestTemplates(cloudstackTestCase): ) return - @attr(tags = ["advanced", "advancedns"]) + @attr(tags = ["advanced", "advancedns", "multizone"]) def test_02_copy_template(self): """Test for copy template from one zone to another""" @@ -525,6 +526,7 @@ class TestTemplates(cloudstackTestCase): ) return + @attr(speed = "slow") @attr(tags = ["advanced", "advancedns"]) def test_04_template_from_snapshot(self): """Create Template from snapshot diff --git a/test/integration/component/test_upload_volumes.py b/test/integration/component/test_upload_volumes.py index e5ba376892d..5f4713ab8ec 100644 --- a/test/integration/component/test_upload_volumes.py +++ b/test/integration/component/test_upload_volumes.py @@ -17,6 +17,7 @@ #Import Local Modules import marvin +from nose.plugins.attrib import attr from marvin.cloudstackTestCase import * from marvin.cloudstackAPI import * from integration.lib.utils import * @@ -43,7 +44,7 @@ class Services: "username": "test", # Random characters are appended for unique # username - "password": "fr3sca", + "password": "password", }, "service_offering": { "name": "Tiny Instance", @@ -89,7 +90,7 @@ class Services: "publicport": 22, }, "sleep": 50, - "ostypeid": 'e6e3dd0f-03c8-4cab-9c32-89769c17ccb3', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', "mode": 'basic', } @@ -158,6 +159,7 @@ class TestUploadDataDisk(cloudstackTestCase): except Exception as e: raise Exception("Warning: Exception during cleanup : %s" % e) + @attr(speed = "slow") @attr(tags = ["advanced", "basic", "eip", "advancedns", "sg"]) def test_01_upload_data_disk(self): """Test Upload a data disk @@ -211,6 +213,7 @@ class TestUploadDataDisk(cloudstackTestCase): ) return + @attr(speed = "slow") @attr(tags = ["advanced", "basic", "eip", "advancedns", "sg"]) def test_02_upload_volume_limit(self): """Test upload volume limits @@ -757,7 +760,7 @@ class TestUploadDiskMultiStorage(cloudstackTestCase): except Exception as e: raise Exception("Warning: Exception during cleanup : %s" % e) - @attr(tags = ["advanced", "basic", "eip", "advancedns", "sg"]) + @attr(tags = ["advanced", "basic", "eip", "advancedns", "sg", "multistorage"]) def test_01_upload_volume_multi_sec_storage(self): """Test Upload a data disk when multiple sec storages are present """ @@ -826,7 +829,7 @@ class TestUploadDiskMultiStorage(cloudstackTestCase): ) return - @attr(tags = ["advanced", "basic", "eip", "advancedns", "sg"]) + @attr(tags = ["advanced", "basic", "eip", "advancedns", "sg", "multistorage"]) def test_02_upload_volume_multi_pri_storage(self): """Test Upload a data disk when multiple primary storages are present """ diff --git a/test/integration/component/test_usage.py b/test/integration/component/test_usage.py index 166b75a02a6..7103c0f7a6c 100644 --- a/test/integration/component/test_usage.py +++ b/test/integration/component/test_usage.py @@ -15,6 +15,7 @@ """ #Import Local Modules import marvin +from nose.plugins.attrib import attr from marvin.cloudstackTestCase import * from marvin.cloudstackAPI import * from integration.lib.utils import * @@ -37,7 +38,7 @@ class Services: "username": "test", # Random characters are appended for unique # username - "password": "fr3sca", + "password": "password", }, "service_offering": { "name": "Tiny Instance", @@ -67,7 +68,7 @@ class Services: "templates": { "displaytext": 'Template', "name": 'Template', - "ostypeid": '144f66aa-7f74-4cfe-9799-80cc21439cb3', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', "templatefilter": 'self', "url": "http://download.cloud.com/releases/2.0.0/UbuntuServer-10-04-64bit.qcow2.bz2" }, @@ -79,7 +80,7 @@ class Services: "isextractable": True, "isfeatured": True, "ispublic": True, - "ostypeid": '144f66aa-7f74-4cfe-9799-80cc21439cb3', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', }, "lbrule": { "name": "SSH", @@ -97,7 +98,7 @@ class Services: "username": "test", "password": "test", }, - "ostypeid": '144f66aa-7f74-4cfe-9799-80cc21439cb3', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', # Cent OS 5.3 (64 bit) "sleep": 60, "timeout": 10, @@ -174,7 +175,7 @@ class TestVmUsage(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns", "simulator"]) def test_01_vm_usage(self): """Test Create/Destroy VM and verify usage calculation """ @@ -365,7 +366,7 @@ class TestPublicIPUsage(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "eip", "advancedns"]) + @attr(tags = ["advanced", "eip", "advancedns", "simulator"]) def test_01_public_ip_usage(self): """Test Assign new IP and verify usage calculation """ @@ -512,7 +513,7 @@ class TestVolumeUsage(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns", "simulator"]) def test_01_volume_usage(self): """Test Create/delete a volume and verify correct usage is recorded """ @@ -693,8 +694,8 @@ class TestTemplateUsage(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - def test_01_template_usage(self): @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) + def test_01_template_usage(self): """Test Upload/ delete a template and verify correct usage is generated for the template uploaded """ @@ -987,7 +988,7 @@ class TestLBRuleUsage(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "eip", "advancedns"]) + @attr(tags = ["advanced", "eip", "advancedns", "simulator"]) def test_01_lb_usage(self): """Test Create/Delete a LB rule and verify correct usage is recorded """ @@ -1142,7 +1143,8 @@ class TestSnapshotUsage(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns"]) + @attr(speed = "slow") + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns", "simulator"]) def test_01_snapshot_usage(self): """Test Create/Delete a manual snap shot and verify correct usage is recorded @@ -1313,7 +1315,7 @@ class TestNatRuleUsage(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "advancedns"]) + @attr(tags = ["advanced", "advancedns", "simulator"]) def test_01_nat_usage(self): """Test Create/Delete a PF rule and verify correct usage is recorded """ diff --git a/test/integration/component/test_vmware_drs.py b/test/integration/component/test_vmware_drs.py index 090e9388f96..5420083dad6 100644 --- a/test/integration/component/test_vmware_drs.py +++ b/test/integration/component/test_vmware_drs.py @@ -16,6 +16,7 @@ """ #Import Local Modules import marvin +from nose.plugins.attrib import attr from marvin.cloudstackTestCase import * from marvin.cloudstackAPI import * from marvin.remoteSSHClient import remoteSSHClient @@ -77,7 +78,7 @@ class Services: "sleep": 60, "timeout": 10, "full_host": "10.147.29.53", - "ostypeid": 'd96fc3f0-a1d3-4498-88aa-a7a1ca96c1bb', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', # CentOS 5.3 (64-bit) } @@ -154,7 +155,7 @@ class TestVMPlacement(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "vmware"])_ + @attr(tags = ["advanced", "vmware", "multihost"]) def test_vm_creation_in_fully_automated_mode(self): """ Test VM Creation in automation mode = Fully automated This test requires following preconditions: @@ -280,7 +281,7 @@ class TestAntiAffinityRules(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "vmware"]) + @attr(tags = ["advanced", "vmware", "multihost"]) def test_vmware_anti_affinity(self): """ Test Set up anti-affinity rules @@ -481,7 +482,7 @@ class TestAffinityRules(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "vmware"]) + @attr(tags = ["advanced", "vmware", "multihost"]) def test_vmware_affinity(self): """ Test Set up affinity rules diff --git a/test/integration/component/test_volumes.py b/test/integration/component/test_volumes.py index 55acc4c6a41..679455acacc 100644 --- a/test/integration/component/test_volumes.py +++ b/test/integration/component/test_volumes.py @@ -15,6 +15,7 @@ """ #Import Local Modules import marvin +from nose.plugins.attrib import attr from marvin.cloudstackTestCase import * from marvin.cloudstackAPI import * from integration.lib.utils import * @@ -41,7 +42,7 @@ class Services: "username": "test", # Random characters are appended for unique # username - "password": "fr3sca", + "password": "password", }, "service_offering": { "name": "Tiny Instance", @@ -75,10 +76,10 @@ class Services: "name": "testISO", "url": "http://iso.linuxquestions.org/download/504/1819/http/gd4.tuwien.ac.at/dsl-4.4.10.iso", # Source URL where ISO is located - "ostypeid": '5776c0d2-f331-42db-ba3a-29f1f8319bc9', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', }, "sleep": 50, - "ostypeid": '5776c0d2-f331-42db-ba3a-29f1f8319bc9', + "ostypeid": '01853327-513e-4508-9628-f1f55db1946f', "mode": 'advanced', } From 45eb035e20aeca6936410a54a6d161a8fb05620b Mon Sep 17 00:00:00 2001 From: Pranav Saxena Date: Mon, 20 Aug 2012 11:54:52 +0530 Subject: [PATCH 27/28] CS-15927:Filter to display only Non AutoscaleVMs (name to displayname property change) --- ui/scripts/network.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/scripts/network.js b/ui/scripts/network.js index 1bce9854c93..d109f34fd04 100644 --- a/ui/scripts/network.js +++ b/ui/scripts/network.js @@ -2206,10 +2206,10 @@ function(instance) { // Hiding the AutoScale VMs var nonAutoScale=0; - if( instance.name.match(/AutoScale-LB-/)==null) + if( instance.displayname.match(/AutoScale-LB-/)==null) nonAutoScale =1; else { - if(instance.name.match(/AutoScale-LB-/).length) + if(instance.displayname.match(/AutoScale-LB-/).length) nonAutoScale =0; } var isActiveState = $.inArray(instance.state, ['Destroyed']) == -1; From 953d0b7c0b0fc28b5a90c2bc6ba37a3616b52e76 Mon Sep 17 00:00:00 2001 From: Abhinandan Prateek Date: Mon, 20 Aug 2012 13:24:57 +0530 Subject: [PATCH 28/28] bug CS-16031: marking older snapshots removed in db --- server/src/com/cloud/vm/UserVmManagerImpl.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 72e605610fb..2ca94e22402 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -3507,8 +3507,13 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager _resourceLimitMgr.incrementResourceCount(newAccount.getAccountId(), ResourceType.volume); _usageEventDao.persist(new UsageEventVO(EventTypes.EVENT_VOLUME_CREATE, volume.getAccountId(), volume.getDataCenterId(), volume.getId(), volume.getName(), volume.getDiskOfferingId(), volume.getTemplateId(), volume.getSize())); + //snapshots: mark these removed in db + List snapshots = _snapshotDao.listByVolumeIdIncludingRemoved(volume.getId()); + for (SnapshotVO snapshot: snapshots){ + _snapshotDao.remove(snapshot.getId()); + } } - + _resourceLimitMgr.incrementResourceCount(newAccount.getAccountId(), ResourceType.user_vm); //generate usage events to account for this change _usageEventDao.persist(new UsageEventVO(EventTypes.EVENT_VM_CREATE, vm.getAccountId(), vm.getDataCenterIdToDeployIn(), vm.getId(),