mirror of https://github.com/apache/cloudstack.git
Merge branch 'master' into internallb1
Conflicts: api/src/com/cloud/async/AsyncJob.java api/src/com/cloud/network/NetworkModel.java api/src/com/cloud/network/rules/LoadBalancerContainer.java api/src/org/apache/cloudstack/api/BaseCmd.java api/src/org/apache/cloudstack/api/ResponseGenerator.java api/src/org/apache/cloudstack/network/lb/ApplicationLoadBalancerContainer.java client/tomcatconf/commands.properties.in engine/schema/src/com/cloud/network/dao/LoadBalancerDaoImpl.java server/src/com/cloud/api/ApiResponseHelper.java server/src/com/cloud/network/NetworkManagerImpl.java server/src/com/cloud/network/NetworkModelImpl.java server/src/com/cloud/network/NetworkServiceImpl.java server/src/com/cloud/server/ManagementServerImpl.java server/test/com/cloud/network/MockNetworkModelImpl.java server/test/com/cloud/vpc/MockNetworkManagerImpl.java server/test/com/cloud/vpc/MockNetworkModelImpl.java server/test/resources/appLoadBalancer.xml setup/db/db/schema-410to420.sql test/integration/component/test_multiple_ip_ranges.py test/integration/smoke/test_guest_vlan_range.py tools/marvin/marvin/integration/lib/base.py
This commit is contained in:
commit
1b8a6986a6
|
|
@ -407,6 +407,7 @@ public class EventTypes {
|
|||
public static final String EVENT_GUEST_VLAN_RANGE_DEDICATE = "GUESTVLANRANGE.DEDICATE";
|
||||
public static final String EVENT_DEDICATED_GUEST_VLAN_RANGE_RELEASE = "GUESTVLANRANGE.RELEASE";
|
||||
|
||||
|
||||
static {
|
||||
|
||||
// TODO: need a way to force author adding event types to declare the entity details as well, with out braking
|
||||
|
|
|
|||
|
|
@ -427,8 +427,11 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L
|
|||
prodVersion = prodVersion.trim();
|
||||
}
|
||||
|
||||
if(prodBrand.equals("XCP") && (prodVersion.equals("1.0.0") || prodVersion.equals("1.1.0") || prodVersion.equals("5.6.100") || prodVersion.startsWith("1.4") || prodVersion.startsWith("1.6")))
|
||||
return new XcpServerResource();
|
||||
if(prodBrand.equals("XCP") && (prodVersion.equals("1.0.0") || prodVersion.equals("1.1.0") || prodVersion.equals("5.6.100") || prodVersion.startsWith("1.4"))) {
|
||||
return new XcpServerResource("1.1");
|
||||
} else if (prodBrand.equals("XCP") && prodVersion.startsWith("1.6")) {
|
||||
return new XcpServerResource("1.6");
|
||||
}
|
||||
|
||||
if(prodBrand.equals("XenServer") && prodVersion.equals("5.6.0"))
|
||||
return new XenServer56Resource();
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ import org.apache.log4j.Logger;
|
|||
public class CitrixHelper {
|
||||
private static final Logger s_logger = Logger.getLogger(CitrixHelper.class);
|
||||
private static final HashMap<String, String> _xcp100GuestOsMap = new HashMap<String, String>(70);
|
||||
private static final HashMap<String, String> _xcp160GuestOsMap = new HashMap<String, String>(70);
|
||||
private static final HashMap<String, String> _xenServerGuestOsMap = new HashMap<String, String>(70);
|
||||
private static final HashMap<String, String> _xenServer56FP1GuestOsMap = new HashMap<String, String>(70);
|
||||
private static final HashMap<String, String> _xenServer56FP2GuestOsMap = new HashMap<String, String>(70);
|
||||
|
|
@ -114,6 +115,83 @@ public class CitrixHelper {
|
|||
_xcp100GuestOsMap.put("Other PV (64-bit)", "CentOS 5 (64-bit)");
|
||||
}
|
||||
|
||||
static {
|
||||
_xcp160GuestOsMap.put("CentOS 4.5 (32-bit)", "CentOS 4.5 (32-bit)");
|
||||
_xcp160GuestOsMap.put("CentOS 4.6 (32-bit)", "CentOS 4.6 (32-bit)");
|
||||
_xcp160GuestOsMap.put("CentOS 4.7 (32-bit)", "CentOS 4.7 (32-bit)");
|
||||
_xcp160GuestOsMap.put("CentOS 4.8 (32-bit)", "CentOS 4.8 (32-bit)");
|
||||
_xcp160GuestOsMap.put("CentOS 5.0 (32-bit)", "CentOS 5 (32-bit)");
|
||||
_xcp160GuestOsMap.put("CentOS 5.0 (64-bit)", "CentOS 5 (64-bit)");
|
||||
_xcp160GuestOsMap.put("CentOS 5.1 (32-bit)", "CentOS 5 (32-bit)");
|
||||
_xcp160GuestOsMap.put("CentOS 5.1 (64-bit)", "CentOS 5 (64-bit)");
|
||||
_xcp160GuestOsMap.put("CentOS 5.2 (32-bit)", "CentOS 5 (32-bit)");
|
||||
_xcp160GuestOsMap.put("CentOS 5.2 (64-bit)", "CentOS 5 (64-bit)");
|
||||
_xcp160GuestOsMap.put("CentOS 5.3 (32-bit)", "CentOS 5 (32-bit)");
|
||||
_xcp160GuestOsMap.put("CentOS 5.3 (64-bit)", "CentOS 5 (64-bit)");
|
||||
_xcp160GuestOsMap.put("CentOS 5.4 (32-bit)", "CentOS 5 (32-bit)");
|
||||
_xcp160GuestOsMap.put("CentOS 5.4 (64-bit)", "CentOS 5 (64-bit)");
|
||||
_xcp160GuestOsMap.put("CentOS 5.5 (32-bit)", "CentOS 5 (32-bit)");
|
||||
_xcp160GuestOsMap.put("CentOS 5.5 (64-bit)", "CentOS 5 (64-bit)");
|
||||
_xcp160GuestOsMap.put("Debian GNU/Linux 5.0 (32-bit)", "Debian Lenny 5.0 (32-bit)");
|
||||
_xcp160GuestOsMap.put("Debian GNU/Linux 6(32-bit)", "Debian Squeeze 6.0 (32-bit)");
|
||||
_xcp160GuestOsMap.put("Debian GNU/Linux 6(64-bit)", "Debian Squeeze 6.0 (64-bit)");
|
||||
_xcp160GuestOsMap.put("Oracle Enterprise Linux 5.0 (32-bit)", "Oracle Enterprise Linux 5 (32-bit)");
|
||||
_xcp160GuestOsMap.put("Oracle Enterprise Linux 5.0 (64-bit)", "Oracle Enterprise Linux 5 (64-bit)");
|
||||
_xcp160GuestOsMap.put("Oracle Enterprise Linux 5.1 (32-bit)", "Oracle Enterprise Linux 5 (32-bit)");
|
||||
_xcp160GuestOsMap.put("Oracle Enterprise Linux 5.1 (64-bit)", "Oracle Enterprise Linux 5 (64-bit)");
|
||||
_xcp160GuestOsMap.put("Oracle Enterprise Linux 5.2 (32-bit)", "Oracle Enterprise Linux 5 (32-bit)");
|
||||
_xcp160GuestOsMap.put("Oracle Enterprise Linux 5.2 (64-bit)", "Oracle Enterprise Linux 5 (64-bit)");
|
||||
_xcp160GuestOsMap.put("Oracle Enterprise Linux 5.3 (32-bit)", "Oracle Enterprise Linux 5 (32-bit)");
|
||||
_xcp160GuestOsMap.put("Oracle Enterprise Linux 5.3 (64-bit)", "Oracle Enterprise Linux 5 (64-bit)");
|
||||
_xcp160GuestOsMap.put("Oracle Enterprise Linux 5.4 (32-bit)", "Oracle Enterprise Linux 5 (32-bit)");
|
||||
_xcp160GuestOsMap.put("Oracle Enterprise Linux 5.4 (64-bit)", "Oracle Enterprise Linux 5 (64-bit)");
|
||||
_xcp160GuestOsMap.put("Oracle Enterprise Linux 5.5 (32-bit)", "Oracle Enterprise Linux 5 (32-bit)");
|
||||
_xcp160GuestOsMap.put("Oracle Enterprise Linux 5.5 (64-bit)", "Oracle Enterprise Linux 5 (64-bit)");
|
||||
_xcp160GuestOsMap.put("Red Hat Enterprise Linux 4.5 (32-bit)", "Red Hat Enterprise Linux 4.5 (32-bit)");
|
||||
_xcp160GuestOsMap.put("Red Hat Enterprise Linux 4.6 (32-bit)", "Red Hat Enterprise Linux 4.6 (32-bit)");
|
||||
_xcp160GuestOsMap.put("Red Hat Enterprise Linux 4.7 (32-bit)", "Red Hat Enterprise Linux 4.7 (32-bit)");
|
||||
_xcp160GuestOsMap.put("Red Hat Enterprise Linux 4.8 (32-bit)", "Red Hat Enterprise Linux 4.8 (32-bit)");
|
||||
_xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.0 (32-bit)", "Red Hat Enterprise Linux 5 (32-bit)");
|
||||
_xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.0 (64-bit)", "Red Hat Enterprise Linux 5 (64-bit)");
|
||||
_xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.1 (32-bit)", "Red Hat Enterprise Linux 5 (32-bit)");
|
||||
_xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.1 (64-bit)", "Red Hat Enterprise Linux 5 (64-bit)");
|
||||
_xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.2 (32-bit)", "Red Hat Enterprise Linux 5 (32-bit)");
|
||||
_xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.2 (64-bit)", "Red Hat Enterprise Linux 5 (64-bit)");
|
||||
_xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.3 (32-bit)", "Red Hat Enterprise Linux 5 (32-bit)");
|
||||
_xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.3 (64-bit)", "Red Hat Enterprise Linux 5 (64-bit)");
|
||||
_xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.4 (32-bit)", "Red Hat Enterprise Linux 5 (32-bit)");
|
||||
_xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.4 (64-bit)", "Red Hat Enterprise Linux 5 (64-bit)");
|
||||
_xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.5 (32-bit)", "Red Hat Enterprise Linux 5 (32-bit)");
|
||||
_xcp160GuestOsMap.put("Red Hat Enterprise Linux 5.5 (64-bit)", "Red Hat Enterprise Linux 5 (64-bit)");
|
||||
_xcp160GuestOsMap.put("Red Hat Enterprise Linux 6.0 (32-bit)", "Red Hat Enterprise Linux 6 (32-bit)");
|
||||
_xcp160GuestOsMap.put("Red Hat Enterprise Linux 6.0 (64-bit)", "Red Hat Enterprise Linux 6 (64-bit)");
|
||||
_xcp160GuestOsMap.put("SUSE Linux Enterprise Server 9 SP4 (32-bit)", "SUSE Linux Enterprise Server 9 SP4");
|
||||
_xcp160GuestOsMap.put("SUSE Linux Enterprise Server 10 SP1 (32-bit)", "SUSE Linux Enterprise Server 10 SP1");
|
||||
_xcp160GuestOsMap.put("SUSE Linux Enterprise Server 10 SP1 (64-bit)", "SUSE Linux Enterprise Server 10 SP1 x64");
|
||||
_xcp160GuestOsMap.put("SUSE Linux Enterprise Server 10 SP2 (32-bit)", "SUSE Linux Enterprise Server 10 SP2");
|
||||
_xcp160GuestOsMap.put("SUSE Linux Enterprise Server 10 SP2 (64-bit)", "SUSE Linux Enterprise Server 10 SP2 x64");
|
||||
_xcp160GuestOsMap.put("SUSE Linux Enterprise Server 10 SP3 (64-bit)", "Other install media");
|
||||
_xcp160GuestOsMap.put("SUSE Linux Enterprise Server 11 (32-bit)", "SUSE Linux Enterprise Server 11");
|
||||
_xcp160GuestOsMap.put("SUSE Linux Enterprise Server 11 (64-bit)", "SUSE Linux Enterprise Server 11 x64");
|
||||
_xcp160GuestOsMap.put("SUSE Linux Enterprise Server 11 SP1 (32-bit)", "SUSE Linux Enterprise Server 11 SP1 (32-bit)");
|
||||
_xcp160GuestOsMap.put("SUSE Linux Enterprise Server 11 SP1 (64-bit)", "SUSE Linux Enterprise Server 11 SP1 (64-bit)");
|
||||
_xcp160GuestOsMap.put("Windows 7 (32-bit)", "Windows 7 (32-bit)");
|
||||
_xcp160GuestOsMap.put("Windows 7 (64-bit)", "Windows 7 (64-bit)");
|
||||
_xcp160GuestOsMap.put("Windows Server 2003 (32-bit)", "Windows Server 2003 (32-bit)");
|
||||
_xcp160GuestOsMap.put("Windows Server 2003 (64-bit)", "Windows Server 2003 (64-bit)");
|
||||
_xcp160GuestOsMap.put("Windows Server 2008 (32-bit)", "Windows Server 2008 (32-bit)");
|
||||
_xcp160GuestOsMap.put("Windows Server 2008 (64-bit)", "Windows Server 2008 (64-bit)");
|
||||
_xcp160GuestOsMap.put("Windows Server 2008 R2 (64-bit)", "Windows Server 2008 R2 (64-bit)");
|
||||
_xcp160GuestOsMap.put("Windows XP SP3 (32-bit)", "Windows XP SP3 (32-bit)");
|
||||
_xcp160GuestOsMap.put("Windows Vista (32-bit)", "Windows Vista (32-bit)");
|
||||
_xcp160GuestOsMap.put("Ubuntu 10.04 (32-bit)", "Ubuntu Lucid Lynx 10.04 (32-bit) (experimental)");
|
||||
_xcp160GuestOsMap.put("Ubuntu 10.04 (64-bit)", "Ubuntu Lucid Lynx 10.04 (64-bit) (experimental)");
|
||||
_xcp160GuestOsMap.put("Other Linux (32-bit)", "Other install media");
|
||||
_xcp160GuestOsMap.put("Other Linux (64-bit)", "Other install media");
|
||||
_xcp160GuestOsMap.put("Other PV (32-bit)", "CentOS 5 (32-bit)");
|
||||
_xcp160GuestOsMap.put("Other PV (64-bit)", "CentOS 5 (64-bit)");
|
||||
}
|
||||
|
||||
|
||||
static {
|
||||
_xenServerGuestOsMap.put("CentOS 4.5 (32-bit)", "CentOS 4.5 (32-bit)");
|
||||
|
|
@ -694,6 +772,15 @@ public class CitrixHelper {
|
|||
return guestOS;
|
||||
}
|
||||
|
||||
public static String getXcp160GuestOsType(String stdType) {
|
||||
String guestOS = _xcp160GuestOsMap.get(stdType);
|
||||
if (guestOS == null) {
|
||||
s_logger.debug("Can't find the guest os: " + stdType + " mapping into XCP's guestOS type, start it as HVM guest");
|
||||
guestOS = "Other install media";
|
||||
}
|
||||
return guestOS;
|
||||
}
|
||||
|
||||
|
||||
public static String getXenServerGuestOsType(String stdType, boolean bootFromCD) {
|
||||
String guestOS = _xenServerGuestOsMap.get(stdType);
|
||||
|
|
|
|||
|
|
@ -39,9 +39,10 @@ import com.xensource.xenapi.Types.XenAPIException;
|
|||
@Local(value=ServerResource.class)
|
||||
public class XcpServerResource extends CitrixResourceBase {
|
||||
private final static Logger s_logger = Logger.getLogger(XcpServerResource.class);
|
||||
|
||||
public XcpServerResource() {
|
||||
private String version;
|
||||
public XcpServerResource(String version) {
|
||||
super();
|
||||
this.version = version;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -55,7 +56,11 @@ public class XcpServerResource extends CitrixResourceBase {
|
|||
|
||||
@Override
|
||||
protected String getGuestOsType(String stdType, boolean bootFromCD) {
|
||||
return CitrixHelper.getXcpGuestOsType(stdType);
|
||||
if (version.equalsIgnoreCase("1.6")) {
|
||||
return CitrixHelper.getXcp160GuestOsType(stdType);
|
||||
} else {
|
||||
return CitrixHelper.getXcpGuestOsType(stdType);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -434,16 +434,14 @@ public class CiscoVnmcElement extends AdapterBase implements SourceNatServicePro
|
|||
|
||||
@Override
|
||||
public boolean isReady(PhysicalNetworkServiceProvider provider) {
|
||||
// TODO Auto-generated method stub
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean shutdownProviderInstances(
|
||||
PhysicalNetworkServiceProvider provider, ReservationContext context)
|
||||
throws ConcurrentOperationException, ResourceUnavailableException {
|
||||
// TODO Auto-generated method stub
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
2
plugins/network-elements/nicira-nvp/src/com/cloud/api/commands/DeleteNiciraNvpDeviceCmd.java
Normal file → Executable file
2
plugins/network-elements/nicira-nvp/src/com/cloud/api/commands/DeleteNiciraNvpDeviceCmd.java
Normal file → Executable file
|
|
@ -95,7 +95,7 @@ public class DeleteNiciraNvpDeviceCmd extends BaseAsyncCmd {
|
|||
|
||||
@Override
|
||||
public String getEventType() {
|
||||
return EventTypes.EVENT_EXTERNAL_LB_DEVICE_DELETE;
|
||||
return EventTypes.EVENT_EXTERNAL_NVP_CONTROLLER_DELETE;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
|||
|
|
@ -129,6 +129,8 @@ import com.cloud.host.HostVO;
|
|||
import com.cloud.host.dao.HostDao;
|
||||
import com.cloud.host.dao.HostDetailsDao;
|
||||
import com.cloud.hypervisor.Hypervisor.HypervisorType;
|
||||
import com.cloud.network.dao.AccountGuestVlanMapDao;
|
||||
import com.cloud.network.dao.AccountGuestVlanMapVO;
|
||||
import com.cloud.network.IpAddress;
|
||||
import com.cloud.network.Network;
|
||||
import com.cloud.network.Network.Capability;
|
||||
|
|
|
|||
|
|
@ -2014,23 +2014,28 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L
|
|||
if (_networksDao.countByZoneAndUri(zoneId, uri) > 0) {
|
||||
throw new InvalidParameterValueException("Network with vlan " + vlanId + " already exists in zone " + zoneId);
|
||||
} else {
|
||||
DataCenterVnetVO dcVnet = _datacenterVnetDao.findVnet(zoneId, vlanId.toString()).get(0);
|
||||
// Fail network creation if specified vlan is dedicated to a different account
|
||||
if (dcVnet.getAccountGuestVlanMapId() != null) {
|
||||
Long accountGuestVlanMapId = dcVnet.getAccountGuestVlanMapId();
|
||||
AccountGuestVlanMapVO map = _accountGuestVlanMapDao.findById(accountGuestVlanMapId);
|
||||
if (map.getAccountId() != owner.getAccountId()) {
|
||||
throw new InvalidParameterValueException("Vlan " + vlanId + " is dedicated to a different account");
|
||||
}
|
||||
// Fail network creation if owner has a dedicated range of vlans but the specified vlan belongs to the system pool
|
||||
} else {
|
||||
List<AccountGuestVlanMapVO> maps = _accountGuestVlanMapDao.listAccountGuestVlanMapsByAccount(owner.getAccountId());
|
||||
if (maps != null && !maps.isEmpty()) {
|
||||
int vnetsAllocatedToAccount = _datacenterVnetDao.countVnetsAllocatedToAccount(zoneId, owner.getAccountId());
|
||||
int vnetsDedicatedToAccount = _datacenterVnetDao.countVnetsDedicatedToAccount(zoneId, owner.getAccountId());
|
||||
if (vnetsAllocatedToAccount < vnetsDedicatedToAccount) {
|
||||
throw new InvalidParameterValueException("Specified vlan " + vlanId + " doesn't belong" +
|
||||
" to the vlan range dedicated to the owner "+ owner.getAccountName());
|
||||
List<DataCenterVnetVO> dcVnets = _datacenterVnetDao.findVnet(zoneId, vlanId.toString());
|
||||
//for the network that is created as part of private gateway,
|
||||
//the vnet is not coming from the data center vnet table, so the list can be empty
|
||||
if (!dcVnets.isEmpty()) {
|
||||
DataCenterVnetVO dcVnet = dcVnets.get(0);
|
||||
// Fail network creation if specified vlan is dedicated to a different account
|
||||
if (dcVnet.getAccountGuestVlanMapId() != null) {
|
||||
Long accountGuestVlanMapId = dcVnet.getAccountGuestVlanMapId();
|
||||
AccountGuestVlanMapVO map = _accountGuestVlanMapDao.findById(accountGuestVlanMapId);
|
||||
if (map.getAccountId() != owner.getAccountId()) {
|
||||
throw new InvalidParameterValueException("Vlan " + vlanId + " is dedicated to a different account");
|
||||
}
|
||||
// Fail network creation if owner has a dedicated range of vlans but the specified vlan belongs to the system pool
|
||||
} else {
|
||||
List<AccountGuestVlanMapVO> maps = _accountGuestVlanMapDao.listAccountGuestVlanMapsByAccount(owner.getAccountId());
|
||||
if (maps != null && !maps.isEmpty()) {
|
||||
int vnetsAllocatedToAccount = _datacenterVnetDao.countVnetsAllocatedToAccount(zoneId, owner.getAccountId());
|
||||
int vnetsDedicatedToAccount = _datacenterVnetDao.countVnetsDedicatedToAccount(zoneId, owner.getAccountId());
|
||||
if (vnetsAllocatedToAccount < vnetsDedicatedToAccount) {
|
||||
throw new InvalidParameterValueException("Specified vlan " + vlanId + " doesn't belong" +
|
||||
" to the vlan range dedicated to the owner "+ owner.getAccountName());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2066,6 +2066,7 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel {
|
|||
return null;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public IpAddress getPublicIpAddress(String ipAddress, long zoneId) {
|
||||
List<? extends Network> networks = _networksDao.listByZoneAndTrafficType(zoneId, TrafficType.Public);
|
||||
|
|
@ -2080,6 +2081,7 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel {
|
|||
public Map<Detail, String> getNtwkOffDetails(long offId) {
|
||||
return _ntwkOffDetailsDao.getNtwkOffDetails(offId);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public Networks.IsolationType[] listNetworkIsolationMethods() {
|
||||
|
|
|
|||
|
|
@ -198,6 +198,7 @@ import java.sql.ResultSet;
|
|||
import java.sql.SQLException;
|
||||
import java.util.*;
|
||||
|
||||
|
||||
/**
|
||||
* NetworkServiceImpl implements NetworkService.
|
||||
*/
|
||||
|
|
@ -2185,6 +2186,7 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService {
|
|||
return allPossibleIps;
|
||||
}
|
||||
|
||||
|
||||
protected boolean canUpgrade(Network network, long oldNetworkOfferingId, long newNetworkOfferingId) {
|
||||
NetworkOffering oldNetworkOffering = _networkOfferingDao.findByIdIncludingRemoved(oldNetworkOfferingId);
|
||||
NetworkOffering newNetworkOffering = _networkOfferingDao.findById(newNetworkOfferingId);
|
||||
|
|
|
|||
|
|
@ -2877,6 +2877,8 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
|
|||
cmdList.add(StartInternalLBVMCmd.class);
|
||||
cmdList.add(ListInternalLBVMsCmd.class);
|
||||
cmdList.add(ListNetworkIsolationMethodsCmd.class);
|
||||
cmdList.add(ListNetworkIsolationMethodsCmd.class);
|
||||
|
||||
return cmdList;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -62,6 +62,7 @@ import com.cloud.network.PhysicalNetworkServiceProvider;
|
|||
import com.cloud.network.PhysicalNetworkTrafficType;
|
||||
import com.cloud.network.PublicIpAddress;
|
||||
import com.cloud.network.addr.PublicIp;
|
||||
import com.cloud.network.dao.AccountGuestVlanMapVO;
|
||||
import com.cloud.network.dao.IPAddressVO;
|
||||
import com.cloud.network.dao.NetworkServiceMapDao;
|
||||
import com.cloud.network.dao.NetworkVO;
|
||||
|
|
@ -91,6 +92,16 @@ import com.cloud.vm.VMInstanceVO;
|
|||
import com.cloud.vm.VirtualMachine;
|
||||
import com.cloud.vm.VirtualMachine.Type;
|
||||
import com.cloud.vm.VirtualMachineProfile;
|
||||
import org.apache.cloudstack.acl.ControlledEntity.ACLType;
|
||||
import org.apache.cloudstack.api.command.admin.network.DedicateGuestVlanRangeCmd;
|
||||
import org.apache.cloudstack.api.command.admin.network.ListDedicatedGuestVlanRangesCmd;
|
||||
import org.apache.cloudstack.api.command.admin.usage.ListTrafficTypeImplementorsCmd;
|
||||
import org.apache.cloudstack.api.command.user.network.CreateNetworkCmd;
|
||||
import org.apache.cloudstack.api.command.user.network.ListNetworksCmd;
|
||||
import org.apache.cloudstack.api.command.user.network.RestartNetworkCmd;
|
||||
import org.apache.cloudstack.api.command.user.vm.ListNicsCmd;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
|
||||
@Component
|
||||
|
|
|
|||
|
|
@ -91,12 +91,12 @@ body {
|
|||
position: absolute;
|
||||
top:32;
|
||||
width: 260;
|
||||
height: 65;
|
||||
height: 95;
|
||||
display: block;
|
||||
display: none;
|
||||
border-top: 1px solid black;
|
||||
background-image:url(/resource/images/back.gif);
|
||||
background-repeat:repeat-x repeat-y;
|
||||
background-image:url(/resource/images/back.gif);
|
||||
background-repeat:repeat-x repeat-y;
|
||||
}
|
||||
|
||||
#toolbar ul li ul li {
|
||||
|
|
|
|||
|
|
@ -23,55 +23,286 @@ under the License.
|
|||
* They are used by the ajaxviewer.js
|
||||
*/
|
||||
|
||||
//client event type. corresponds to events in ajaxviewer.
|
||||
X11_KEY_CIRCUMFLEX_ACCENT = 0x5e; // ^
|
||||
X11_KEY_YEN_MARK = 0xa5;
|
||||
//client event type. corresponds to events in ajaxviewer.
|
||||
|
||||
|
||||
//use java AWT key modifier masks
|
||||
JS_KEY_BACKSPACE = 8;
|
||||
JS_KEY_TAB = 9;
|
||||
JS_KEY_ENTER = 13;
|
||||
JS_KEY_SHIFT = 16;
|
||||
JS_KEY_CTRL = 17;
|
||||
JS_KEY_ALT = 18;
|
||||
JS_KEY_CAPSLOCK = 20;
|
||||
JS_KEY_ESCAPE = 27;
|
||||
JS_KEY_PAGEUP = 33;
|
||||
JS_KEY_PAGEDOWN = 34;
|
||||
JS_KEY_END = 35;
|
||||
JS_KEY_HOME = 36;
|
||||
JS_KEY_LEFT = 37;
|
||||
JS_KEY_UP = 38;
|
||||
JS_KEY_RIGHT = 39;
|
||||
JS_KEY_DOWN = 40;
|
||||
JS_KEY_INSERT = 45;
|
||||
JS_KEY_DELETE = 46;
|
||||
JS_KEY_SELECT_KEY = 93;
|
||||
JS_KEY_NUMPAD0 = 96;
|
||||
JS_KEY_NUMPAD1 = 97;
|
||||
JS_KEY_NUMPAD2 = 98;
|
||||
JS_KEY_NUMPAD3 = 99;
|
||||
JS_KEY_NUMPAD4 = 100;
|
||||
JS_KEY_NUMPAD5 = 101;
|
||||
JS_KEY_NUMPAD6 = 102;
|
||||
JS_KEY_NUMPAD7 = 103;
|
||||
JS_KEY_NUMPAD8 = 104;
|
||||
JS_KEY_NUMPAD9 = 105;
|
||||
JS_KEY_MULTIPLY = 106;
|
||||
JS_KEY_ADD = 107;
|
||||
JS_KEY_SUBSTRACT = 109;
|
||||
JS_KEY_DECIMAL_POINT = 110;
|
||||
JS_KEY_DIVIDE = 111;
|
||||
JS_KEY_F1 = 112;
|
||||
JS_KEY_F2 = 113;
|
||||
JS_KEY_F3 = 114;
|
||||
JS_KEY_F4 = 115;
|
||||
JS_KEY_F5 = 116;
|
||||
JS_KEY_F6 = 117;
|
||||
JS_KEY_F7 = 118;
|
||||
JS_KEY_F8 = 119;
|
||||
JS_KEY_F9 = 120;
|
||||
JS_KEY_F10 = 121;
|
||||
JS_KEY_F11 = 122;
|
||||
JS_KEY_F12 = 123;
|
||||
JS_KEY_SEMI_COLON = 186; // ;
|
||||
JS_KEY_COMMA = 188; // ,
|
||||
JS_KEY_DASH = 189; // -
|
||||
JS_KEY_PERIOD = 190; // .
|
||||
JS_KEY_FORWARD_SLASH = 191; // /
|
||||
JS_KEY_GRAVE_ACCENT = 192; // `
|
||||
JS_KEY_OPEN_BRACKET = 219; // [
|
||||
JS_KEY_BACK_SLASH = 220; // \
|
||||
JS_KEY_CLOSE_BRACKET = 221; // ]
|
||||
JS_KEY_SINGLE_QUOTE = 222; // '
|
||||
|
||||
|
||||
//X11 keysym definitions
|
||||
X11_KEY_CAPSLOCK = 0xffe5;
|
||||
X11_KEY_BACKSPACE = 0xff08;
|
||||
X11_KEY_TAB = 0xff09;
|
||||
X11_KEY_ENTER = 0xff0d;
|
||||
X11_KEY_ESCAPE = 0xff1b;
|
||||
X11_KEY_INSERT = 0xff63;
|
||||
X11_KEY_DELETE = 0xffff;
|
||||
X11_KEY_HOME = 0xff50;
|
||||
X11_KEY_END = 0xff57;
|
||||
X11_KEY_PAGEUP = 0xff55;
|
||||
X11_KEY_PAGEDOWN = 0xff56;
|
||||
X11_KEY_LEFT = 0xff51;
|
||||
X11_KEY_UP = 0xff52;
|
||||
X11_KEY_RIGHT = 0xff53;
|
||||
X11_KEY_DOWN = 0xff54;
|
||||
X11_KEY_F1 = 0xffbe;
|
||||
X11_KEY_F2 = 0xffbf;
|
||||
X11_KEY_F3 = 0xffc0;
|
||||
X11_KEY_F4 = 0xffc1;
|
||||
X11_KEY_F5 = 0xffc2;
|
||||
X11_KEY_F6 = 0xffc3;
|
||||
X11_KEY_F7 = 0xffc4;
|
||||
X11_KEY_F8 = 0xffc5;
|
||||
X11_KEY_F9 = 0xffc6;
|
||||
X11_KEY_F10 = 0xffc7;
|
||||
X11_KEY_F11 = 0xffc8;
|
||||
X11_KEY_F12 = 0xffc9;
|
||||
X11_KEY_SHIFT = 0xffe1;
|
||||
X11_KEY_CTRL = 0xffe3;
|
||||
X11_KEY_ALT = 0xffe9;
|
||||
X11_KEY_GRAVE_ACCENT = 0x60;
|
||||
X11_KEY_SUBSTRACT = 0x2d;
|
||||
X11_KEY_ADD = 0x2b;
|
||||
X11_KEY_OPEN_BRACKET = 0x5b;
|
||||
X11_KEY_CLOSE_BRACKET = 0x5d;
|
||||
X11_KEY_BACK_SLASH = 0x7c;
|
||||
X11_KEY_REVERSE_SOLIUS = 0x5c; // another back slash (back slash on JP keyboard)
|
||||
X11_KEY_SINGLE_QUOTE = 0x22;
|
||||
X11_KEY_COMMA = 0x3c;
|
||||
X11_KEY_PERIOD = 0x3e;
|
||||
X11_KEY_FORWARD_SLASH = 0x3f;
|
||||
X11_KEY_DASH = 0x2d;
|
||||
X11_KEY_COLON = 0x3a;
|
||||
X11_KEY_REVERSE_SOLIUS = 0x5c; // another back slash (back slash on JP keyboard)
|
||||
X11_KEY_CAPSLOCK = 0xffe5;
|
||||
X11_KEY_SEMI_COLON = 0x3b;
|
||||
X11_KEY_SHIFT = 0xffe1;
|
||||
X11_KEY_ADD = 0x2b;
|
||||
X11_KEY_NUMPAD0 = 0x30;
|
||||
X11_KEY_NUMPAD1 = 0x31;
|
||||
X11_KEY_NUMPAD2 = 0x32;
|
||||
X11_KEY_NUMPAD3 = 0x33;
|
||||
X11_KEY_NUMPAD4 = 0x34;
|
||||
X11_KEY_NUMPAD5 = 0x35;
|
||||
X11_KEY_NUMPAD6 = 0x36;
|
||||
X11_KEY_NUMPAD7 = 0x37;
|
||||
X11_KEY_NUMPAD8 = 0x38;
|
||||
X11_KEY_NUMPAD9 = 0x39;
|
||||
X11_KEY_DECIMAL_POINT = 0x2e;
|
||||
X11_KEY_DIVIDE = 0x3f;
|
||||
X11_KEY_TILDE = 0x7e; // ~
|
||||
X11_KEY_CIRCUMFLEX_ACCENT = 0x5e; // ^
|
||||
X11_KEY_YEN_MARK = 0xa5; // Japanese YEN mark
|
||||
X11_KEY_ASTERISK = 0x2a;
|
||||
|
||||
KEY_DOWN = 5;
|
||||
KEY_UP = 6;
|
||||
|
||||
KEYBOARD_TYPE_COOKED = "us";
|
||||
KEYBOARD_TYPE_JP = "jp";
|
||||
KEYBOARD_TYPE_UK = "uk";
|
||||
|
||||
//JP keyboard type
|
||||
//
|
||||
//
|
||||
var keyboardTables = [
|
||||
{tindex: 0, keyboardType: "EN-Cooked", mappingTable:
|
||||
{X11: [ {keycode: 222, entry: X11_KEY_CIRCUMFLEX_ACCENT},
|
||||
{tindex: 0, keyboardType: KEYBOARD_TYPE_COOKED, mappingTable:
|
||||
{X11: [ {keycode: 222, entry: X11_KEY_CIRCUMFLEX_ACCENT},
|
||||
{keycode: 220, entry: X11_KEY_YEN_MARK},
|
||||
{keycode: 219, entry: X11_KEY_OPEN_BRACKET},
|
||||
{keycode: 221, entry: X11_KEY_CLOSE_BRACKET},
|
||||
{keycode: 59, entry: X11_KEY_COLON, browser: "Firefox"},
|
||||
{keycode: 186, entry: X11_KEY_COLON, browser: "Chrome"},
|
||||
{keycode: 9, entry: 9, guestos: "XenServer"},
|
||||
{keycode: 226, entry: X11_KEY_REVERSE_SOLIUS},
|
||||
|
||||
{keycode: 240, entry: [
|
||||
{type: KEY_DOWN, code: X11_KEY_CAPSLOCK, modifiers: 0 },
|
||||
{type: KEY_UP, code: X11_KEY_CAPSLOCK, modifiers: 0 },
|
||||
]
|
||||
}
|
||||
],
|
||||
keyPress: [
|
||||
{keycode: 59, entry: [
|
||||
{type: KEY_DOWN, code: X11_KEY_SEMI_COLON, modifiers: 0 },
|
||||
{type: KEY_UP, code: X11_KEY_SEMI_COLON, modifiers: 0 },
|
||||
]
|
||||
},
|
||||
],
|
||||
keyPress: [
|
||||
{keycode: 59, entry: [
|
||||
{type: KEY_DOWN, code: X11_KEY_SEMI_COLON, modifiers: 0 },
|
||||
{type: KEY_UP, code: X11_KEY_SEMI_COLON, modifiers: 0 },
|
||||
]
|
||||
},
|
||||
{keycode: 43, entry: [
|
||||
{type: KEY_DOWN, code: X11_KEY_SHIFT, modifiers: 0, shift: false },
|
||||
{type: KEY_DOWN, code: X11_KEY_ADD, modifiers: 0, shift: false },
|
||||
{type: KEY_UP, code: X11_KEY_ADD, modifiers: 0, shift: false },
|
||||
{type: KEY_UP, code: X11_KEY_SHIFT, modifiers: 0, shift: false },
|
||||
{type: KEY_DOWN, code: X11_KEY_ADD, modifiers: 0, shift: true },
|
||||
{type: KEY_UP, code: X11_KEY_ADD, modifiers: 0, shift: true },
|
||||
]
|
||||
},
|
||||
]
|
||||
}
|
||||
} ]
|
||||
{keycode: 43, entry: [
|
||||
{type: KEY_DOWN, code: X11_KEY_SHIFT, modifiers: 0, shift: false },
|
||||
{type: KEY_DOWN, code: X11_KEY_ADD, modifiers: 0, shift: false },
|
||||
{type: KEY_UP, code: X11_KEY_ADD, modifiers: 0, shift: false },
|
||||
{type: KEY_UP, code: X11_KEY_SHIFT, modifiers: 0, shift: false },
|
||||
{type: KEY_DOWN, code: X11_KEY_ADD, modifiers: 0, shift: true },
|
||||
{type: KEY_UP, code: X11_KEY_ADD, modifiers: 0, shift: true },
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}, {tindex: 1, keyboardType: KEYBOARD_TYPE_JP, mappingTable:
|
||||
// intialize keyboard mapping for RAW keyboard
|
||||
{X11: [
|
||||
{keycode: JS_KEY_CAPSLOCK, entry : X11_KEY_CAPSLOCK},
|
||||
{keycode: JS_KEY_BACKSPACE, entry : X11_KEY_BACKSPACE},
|
||||
{keycode: JS_KEY_TAB, entry : X11_KEY_TAB},
|
||||
{keycode: JS_KEY_ENTER, entry : X11_KEY_ENTER},
|
||||
{keycode: JS_KEY_ESCAPE, entry : X11_KEY_ESCAPE},
|
||||
{keycode: JS_KEY_INSERT, entry : X11_KEY_INSERT},
|
||||
{keycode: JS_KEY_DELETE, entry : X11_KEY_DELETE},
|
||||
{keycode: JS_KEY_HOME, entry : X11_KEY_HOME},
|
||||
{keycode: JS_KEY_END, entry : X11_KEY_END},
|
||||
{keycode: JS_KEY_PAGEUP, entry : X11_KEY_PAGEUP},
|
||||
{keycode: JS_KEY_PAGEDOWN, entry : X11_KEY_PAGEDOWN},
|
||||
{keycode: JS_KEY_LEFT, entry : X11_KEY_LEFT},
|
||||
{keycode: JS_KEY_UP, entry : X11_KEY_UP},
|
||||
{keycode: JS_KEY_RIGHT, entry : X11_KEY_RIGHT},
|
||||
{keycode: JS_KEY_DOWN, entry : X11_KEY_DOWN},
|
||||
{keycode: JS_KEY_F1, entry : X11_KEY_F1},
|
||||
{keycode: JS_KEY_F2, entry : X11_KEY_F2},
|
||||
{keycode: JS_KEY_F3, entry : X11_KEY_F3},
|
||||
{keycode: JS_KEY_F4, entry : X11_KEY_F4},
|
||||
{keycode: JS_KEY_F5, entry : X11_KEY_F5},
|
||||
{keycode: JS_KEY_F6, entry : X11_KEY_F6},
|
||||
{keycode: JS_KEY_F7, entry : X11_KEY_F7},
|
||||
{keycode: JS_KEY_F8, entry : X11_KEY_F8},
|
||||
{keycode: JS_KEY_F9, entry : X11_KEY_F9},
|
||||
{keycode: JS_KEY_F10, entry : X11_KEY_F10},
|
||||
{keycode: JS_KEY_F11, entry : X11_KEY_F11},
|
||||
{keycode: JS_KEY_F12, entry : X11_KEY_F12},
|
||||
{keycode: JS_KEY_SHIFT, entry : X11_KEY_SHIFT},
|
||||
{keycode: JS_KEY_CTRL, entry : X11_KEY_CTRL},
|
||||
{keycode: JS_KEY_ALT, entry : X11_KEY_ALT},
|
||||
{keycode: JS_KEY_GRAVE_ACCENT, entry : X11_KEY_GRAVE_ACCENT},
|
||||
{keycode: JS_KEY_SUBSTRACT, entry : X11_KEY_SUBSTRACT},
|
||||
{keycode: JS_KEY_ADD, entry : X11_KEY_ADD},
|
||||
{keycode: JS_KEY_OPEN_BRACKET, entry : X11_KEY_OPEN_BRACKET},
|
||||
{keycode: JS_KEY_CLOSE_BRACKET, entry : X11_KEY_CLOSE_BRACKET},
|
||||
{keycode: JS_KEY_BACK_SLASH, entry : X11_KEY_BACK_SLASH},
|
||||
{keycode: JS_KEY_SINGLE_QUOTE, entry : X11_KEY_SINGLE_QUOTE},
|
||||
{keycode: JS_KEY_COMMA, entry : X11_KEY_COMMA},
|
||||
{keycode: JS_KEY_PERIOD, entry : X11_KEY_PERIOD},
|
||||
{keycode: JS_KEY_FORWARD_SLASH, entry : X11_KEY_FORWARD_SLASH},
|
||||
{keycode: JS_KEY_DASH, entry : X11_KEY_DASH},
|
||||
{keycode: JS_KEY_SEMI_COLON, entry : X11_KEY_SEMI_COLON},
|
||||
{keycode: JS_KEY_NUMPAD0, entry : X11_KEY_NUMPAD0},
|
||||
{keycode: JS_KEY_NUMPAD1, entry : X11_KEY_NUMPAD1},
|
||||
{keycode: JS_KEY_NUMPAD2, entry : X11_KEY_NUMPAD2},
|
||||
{keycode: JS_KEY_NUMPAD3, entry : X11_KEY_NUMPAD3},
|
||||
{keycode: JS_KEY_NUMPAD4, entry : X11_KEY_NUMPAD4},
|
||||
{keycode: JS_KEY_NUMPAD5, entry : X11_KEY_NUMPAD5},
|
||||
{keycode: JS_KEY_NUMPAD6, entry : X11_KEY_NUMPAD6},
|
||||
{keycode: JS_KEY_NUMPAD7, entry : X11_KEY_NUMPAD7},
|
||||
{keycode: JS_KEY_NUMPAD8, entry : X11_KEY_NUMPAD8},
|
||||
{keycode: JS_KEY_NUMPAD9, entry : X11_KEY_NUMPAD9},
|
||||
{keycode: JS_KEY_DECIMAL_POINT, entry : X11_KEY_DECIMAL_POINT},
|
||||
{keycode: JS_KEY_DIVIDE, entry : X11_KEY_DIVIDE},
|
||||
|
||||
{keycode: JS_KEY_MULTIPLY, entry : [
|
||||
{type: KEY_DOWN, code: X11_KEY_SHIFT, modifiers: 0 },
|
||||
{type: KEY_DOWN, code: X11_KEY_ASTERISK, modifiers: 0 },
|
||||
{type: KEY_UP, code: X11_KEY_ASTERISK, modifiers: 0 },
|
||||
{type: KEY_UP, code: X11_KEY_SHIFT, modifiers: 0 }
|
||||
]},
|
||||
{keycode: JS_KEY_ADD, entry : false}
|
||||
],
|
||||
keyPress: [
|
||||
{keycode: 61, entry: [
|
||||
{type: KEY_DOWN, code: X11_KEY_ADD, modifiers: 0, shift: false },
|
||||
{type: KEY_UP, code: X11_KEY_ADD, modifiers: 0, shift: false }
|
||||
]},
|
||||
{keycode: 43, entry: [
|
||||
{type: KEY_DOWN, code: X11_KEY_SHIFT, modifiers: 0, shift: false },
|
||||
{type: KEY_DOWN, code: X11_KEY_ADD, modifiers: 0, shift: false },
|
||||
{type: KEY_UP, code: X11_KEY_ADD, modifiers: 0, shift: false },
|
||||
{type: KEY_UP, code: X11_KEY_SHIFT, modifiers: 0, shift: false },
|
||||
{type: KEY_DOWN, code: X11_KEY_ADD, modifiers: 0, shift: true },
|
||||
{type: KEY_UP, code: X11_KEY_ADD, modifiers: 0, shift: true }
|
||||
]}
|
||||
]
|
||||
}
|
||||
}, {tindex: 2, keyboardType: KEYBOARD_TYPE_UK, mappingTable:
|
||||
{X11: [],
|
||||
keyPress: [
|
||||
//[34 = "]
|
||||
{keycode: 34, entry:
|
||||
[{type : KEY_DOWN, code : 0x40, modifiers : 64, shift : true}]
|
||||
},
|
||||
//[35 = #]
|
||||
{keycode: 35, entry:
|
||||
[{type : KEY_DOWN, code : 0x5c, modifiers : 0, shift : false}]
|
||||
},
|
||||
// [64 = @]
|
||||
{keycode: 64, entry:
|
||||
[{type : KEY_DOWN, code : 0x22, modifiers : 64, shift : true}]
|
||||
},
|
||||
// [92 = \]
|
||||
{keycode: 92, entry:
|
||||
[{type : KEY_DOWN, code : 0xa6, modifiers : 0, shift : false}]
|
||||
},
|
||||
// [126 = ~]
|
||||
{keycode: 126, entry:
|
||||
[{type : KEY_DOWN, code : 0x7c, modifiers : 64, shift : true}]
|
||||
},
|
||||
// [163 = £]
|
||||
{keycode: 163, entry:
|
||||
[{type : KEY_DOWN, code : 0x23, modifiers : 64, shift : true}]
|
||||
},
|
||||
// [172 = ¬]
|
||||
{keycode: 172, entry:
|
||||
[{type : KEY_DOWN, code : 0x7e, modifiers : 64, shift : true}]
|
||||
},
|
||||
// [166 = ¦]
|
||||
{keycode: 166, entry:
|
||||
[{type : KEY_DOWN, code : 0x60, modifiers : 896, shift : false}]
|
||||
}
|
||||
]
|
||||
}
|
||||
}]
|
||||
|
|
|
|||
|
|
@ -99,92 +99,13 @@ function KeyboardMapper() {
|
|||
//
|
||||
KeyboardMapper.KEYBOARD_TYPE_RAW = 0;
|
||||
KeyboardMapper.KEYBOARD_TYPE_COOKED = 1;
|
||||
KeyboardMapper.KEYBOARD_TYPE_UK = 2;
|
||||
|
||||
KeyboardMapper.prototype = {
|
||||
|
||||
|
||||
setKeyboardType : function(keyboardType) {
|
||||
this.keyboardType = keyboardType;
|
||||
|
||||
if(keyboardType == KeyboardMapper.KEYBOARD_TYPE_RAW) {
|
||||
// intialize keyboard mapping for RAW keyboard
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_CAPSLOCK] = AjaxViewer.X11_KEY_CAPSLOCK;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_BACKSPACE] = AjaxViewer.X11_KEY_BACKSPACE;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_TAB] = AjaxViewer.X11_KEY_TAB;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_ENTER] = AjaxViewer.X11_KEY_ENTER;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_ESCAPE] = AjaxViewer.X11_KEY_ESCAPE;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_INSERT] = AjaxViewer.X11_KEY_INSERT;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_DELETE] = AjaxViewer.X11_KEY_DELETE;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_HOME] = AjaxViewer.X11_KEY_HOME;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_END] = AjaxViewer.X11_KEY_END;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_PAGEUP] = AjaxViewer.X11_KEY_PAGEUP;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_PAGEDOWN] = AjaxViewer.X11_KEY_PAGEDOWN;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_LEFT] = AjaxViewer.X11_KEY_LEFT;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_UP] = AjaxViewer.X11_KEY_UP;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_RIGHT] = AjaxViewer.X11_KEY_RIGHT;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_DOWN] = AjaxViewer.X11_KEY_DOWN;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_F1] = AjaxViewer.X11_KEY_F1;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_F2] = AjaxViewer.X11_KEY_F2;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_F3] = AjaxViewer.X11_KEY_F3;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_F4] = AjaxViewer.X11_KEY_F4;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_F5] = AjaxViewer.X11_KEY_F5;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_F6] = AjaxViewer.X11_KEY_F6;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_F7] = AjaxViewer.X11_KEY_F7;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_F8] = AjaxViewer.X11_KEY_F8;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_F9] = AjaxViewer.X11_KEY_F9;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_F10] = AjaxViewer.X11_KEY_F10;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_F11] = AjaxViewer.X11_KEY_F11;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_F12] = AjaxViewer.X11_KEY_F12;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_SHIFT] = AjaxViewer.X11_KEY_SHIFT;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_CTRL] = AjaxViewer.X11_KEY_CTRL;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_ALT] = AjaxViewer.X11_KEY_ALT;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_GRAVE_ACCENT] = AjaxViewer.X11_KEY_GRAVE_ACCENT;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_SUBSTRACT] = AjaxViewer.X11_KEY_SUBSTRACT;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_ADD] = AjaxViewer.X11_KEY_ADD;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_OPEN_BRACKET] = AjaxViewer.X11_KEY_OPEN_BRACKET;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_CLOSE_BRACKET] = AjaxViewer.X11_KEY_CLOSE_BRACKET;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_BACK_SLASH] = AjaxViewer.X11_KEY_BACK_SLASH;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_SINGLE_QUOTE] = AjaxViewer.X11_KEY_SINGLE_QUOTE;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_COMMA] = AjaxViewer.X11_KEY_COMMA;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_PERIOD] = AjaxViewer.X11_KEY_PERIOD;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_FORWARD_SLASH] = AjaxViewer.X11_KEY_FORWARD_SLASH;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_DASH] = AjaxViewer.X11_KEY_DASH;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_SEMI_COLON] = AjaxViewer.X11_KEY_SEMI_COLON;
|
||||
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_NUMPAD0] = AjaxViewer.X11_KEY_NUMPAD0;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_NUMPAD1] = AjaxViewer.X11_KEY_NUMPAD1;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_NUMPAD2] = AjaxViewer.X11_KEY_NUMPAD2;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_NUMPAD3] = AjaxViewer.X11_KEY_NUMPAD3;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_NUMPAD4] = AjaxViewer.X11_KEY_NUMPAD4;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_NUMPAD5] = AjaxViewer.X11_KEY_NUMPAD5;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_NUMPAD6] = AjaxViewer.X11_KEY_NUMPAD6;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_NUMPAD7] = AjaxViewer.X11_KEY_NUMPAD7;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_NUMPAD8] = AjaxViewer.X11_KEY_NUMPAD8;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_NUMPAD9] = AjaxViewer.X11_KEY_NUMPAD9;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_DECIMAL_POINT] = AjaxViewer.X11_KEY_DECIMAL_POINT;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_DIVIDE] = AjaxViewer.X11_KEY_DIVIDE;
|
||||
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_MULTIPLY] = [
|
||||
{type: AjaxViewer.KEY_DOWN, code: AjaxViewer.X11_KEY_SHIFT, modifiers: 0 },
|
||||
{type: AjaxViewer.KEY_DOWN, code: AjaxViewer.X11_KEY_ASTERISK, modifiers: 0 },
|
||||
{type: AjaxViewer.KEY_UP, code: AjaxViewer.X11_KEY_ASTERISK, modifiers: 0 },
|
||||
{type: AjaxViewer.KEY_UP, code: AjaxViewer.X11_KEY_SHIFT, modifiers: 0 }
|
||||
];
|
||||
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_ADD] = false;
|
||||
this.jsKeyPressX11KeysymMap = [];
|
||||
this.jsKeyPressX11KeysymMap[61] = [
|
||||
{type: AjaxViewer.KEY_DOWN, code: AjaxViewer.X11_KEY_ADD, modifiers: 0, shift: false },
|
||||
{type: AjaxViewer.KEY_UP, code: AjaxViewer.X11_KEY_ADD, modifiers: 0, shift: false }
|
||||
];
|
||||
this.jsKeyPressX11KeysymMap[43] = [
|
||||
{type: AjaxViewer.KEY_DOWN, code: AjaxViewer.X11_KEY_SHIFT, modifiers: 0, shift: false },
|
||||
{type: AjaxViewer.KEY_DOWN, code: AjaxViewer.X11_KEY_ADD, modifiers: 0, shift: false },
|
||||
{type: AjaxViewer.KEY_UP, code: AjaxViewer.X11_KEY_ADD, modifiers: 0, shift: false },
|
||||
{type: AjaxViewer.KEY_UP, code: AjaxViewer.X11_KEY_SHIFT, modifiers: 0, shift: false },
|
||||
{type: AjaxViewer.KEY_DOWN, code: AjaxViewer.X11_KEY_ADD, modifiers: 0, shift: true },
|
||||
{type: AjaxViewer.KEY_UP, code: AjaxViewer.X11_KEY_ADD, modifiers: 0, shift: true }
|
||||
];
|
||||
} else {
|
||||
if(keyboardType == KeyboardMapper.KEYBOARD_TYPE_COOKED || keyboardType == KeyboardMapper.KEYBOARD_TYPE_UK) {
|
||||
// initialize mapping for COOKED keyboard
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_CAPSLOCK] = AjaxViewer.X11_KEY_CAPSLOCK;
|
||||
this.jsX11KeysymMap[AjaxViewer.JS_KEY_BACKSPACE] = AjaxViewer.X11_KEY_BACKSPACE;
|
||||
|
|
@ -325,7 +246,6 @@ KeyboardMapper.prototype = {
|
|||
// ENTER/BACKSPACE key should already have been sent through KEY DOWN/KEY UP event
|
||||
if(code == AjaxViewer.JS_KEY_ENTER || code == AjaxViewer.JS_KEY_BACKSPACE)
|
||||
return;
|
||||
|
||||
if(code > 0) {
|
||||
var X11Keysym = code;
|
||||
X11Keysym = this.jsKeyPressX11KeysymMap[code];
|
||||
|
|
@ -475,6 +395,7 @@ AjaxViewer.STATUS_SENDING = 3;
|
|||
AjaxViewer.STATUS_SENT = 4;
|
||||
|
||||
AjaxViewer.KEYBOARD_TYPE_ENGLISH = "us";
|
||||
AjaxViewer.KEYBOARD_TYPE_UK_ENGLISH = "uk";
|
||||
AjaxViewer.KEYBOARD_TYPE_JAPANESE = "jp";
|
||||
|
||||
AjaxViewer.JS_KEY_BACKSPACE = 8;
|
||||
|
|
@ -736,6 +657,10 @@ AjaxViewer.prototype = {
|
|||
this.keyboardMappers[AjaxViewer.KEYBOARD_TYPE_ENGLISH] = mapper;
|
||||
mapper.setKeyboardType(KeyboardMapper.KEYBOARD_TYPE_COOKED);
|
||||
|
||||
var mapper = new KeyboardMapper();
|
||||
this.keyboardMappers[AjaxViewer.KEYBOARD_TYPE_UK_ENGLISH] = mapper;
|
||||
mapper.setKeyboardType(KeyboardMapper.KEYBOARD_TYPE_UK);
|
||||
|
||||
mapper = new KeyboardMapper();
|
||||
this.keyboardMappers[AjaxViewer.KEYBOARD_TYPE_JAPANESE] = mapper;
|
||||
mapper.setKeyboardType(KeyboardMapper.KEYBOARD_TYPE_RAW);
|
||||
|
|
@ -795,25 +720,25 @@ AjaxViewer.prototype = {
|
|||
|
||||
*/
|
||||
// create the mapping table based on the tables input
|
||||
if (keyboardTables != undefined ) {
|
||||
if (keyboardTables != undefined ) {
|
||||
|
||||
for(var i = 0; i < keyboardTables.length; i++) {
|
||||
var mappingTbl = keyboardTables[i];
|
||||
var mappings = mappingTbl.mappingTable;
|
||||
var x11Maps = mappings.X11;
|
||||
for (var j = 0; j < x11Maps.length; j++) {
|
||||
var code = x11Maps[j].keycode;
|
||||
var mappedEntry = x11Maps[j].entry;
|
||||
mapper.jsX11KeysymMap[code] = mappedEntry;
|
||||
for(var i = 0; i < keyboardTables.length; i++) {
|
||||
var mappingTbl = keyboardTables[i];
|
||||
var keyboardType = mappingTbl.keyboardType;
|
||||
var mappings = mappingTbl.mappingTable;
|
||||
var x11Maps = mappings.X11;
|
||||
for (var j = 0; j < x11Maps.length; j++) {
|
||||
var code = x11Maps[j].keycode;
|
||||
var mappedEntry = x11Maps[j].entry;
|
||||
this.keyboardMappers[keyboardType].jsX11KeysymMap[code] = mappedEntry;
|
||||
}
|
||||
var keyPressMaps = mappings.keyPress;
|
||||
for (var j = 0; j < keyPressMaps.length; j++) {
|
||||
var code = keyPressMaps[j].keycode;
|
||||
var mappedEntry = keyPressMaps[j].entry;
|
||||
this.keyboardMappers[keyboardType].jsKeyPressX11KeysymMap[code] = mappedEntry;
|
||||
}
|
||||
}
|
||||
var keyPressMaps = mappings.keyPress;
|
||||
for (var j = 0; j < keyPressMaps.length; j++) {
|
||||
var code = keyPressMaps[j].keycode;
|
||||
var mappedEntry = keyPressMaps[j].entry;
|
||||
mapper.jsKeyPressX11KeysymMap[code] = mappedEntry;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}, // end of the setupKeyboardTranslationTable function
|
||||
|
|
@ -867,6 +792,9 @@ AjaxViewer.prototype = {
|
|||
} else if(cmd == "keyboard_us") {
|
||||
$("#toolbar").find(".pulldown").find("ul").hide();
|
||||
this.currentKeyboard = AjaxViewer.KEYBOARD_TYPE_ENGLISH;
|
||||
} else if(cmd == "keyboard_uk") {
|
||||
$("#toolbar").find(".pulldown").find("ul").hide();
|
||||
this.currentKeyboard = AjaxViewer.KEYBOARD_TYPE_UK_ENGLISH;
|
||||
} else if(cmd == "sendCtrlAltDel") {
|
||||
this.sendKeyboardEvent(AjaxViewer.KEY_DOWN, 0xffe9, 0); // X11 Alt
|
||||
this.sendKeyboardEvent(AjaxViewer.KEY_DOWN, 0xffe3, 0); // X11 Ctrl
|
||||
|
|
|
|||
|
|
@ -329,6 +329,7 @@ public abstract class ConsoleProxyClientBase implements ConsoleProxyClient, Cons
|
|||
"</a>",
|
||||
"<ul>",
|
||||
"<li><a href=\"#\" cmd=\"keyboard_us\"><span>Standard (US) keyboard</span></a></li>",
|
||||
"<li><a href=\"#\" cmd=\"keyboard_uk\"><span>UK keyboard</span></a></li>",
|
||||
"<li><a href=\"#\" cmd=\"keyboard_jp\"><span>Japanese keyboard</span></a></li>",
|
||||
"</ul>",
|
||||
"</li>",
|
||||
|
|
|
|||
|
|
@ -664,6 +664,7 @@ ALTER TABLE `cloud`.`dc_storage_network_ip_range` ADD COLUMN `gateway` varchar(1
|
|||
|
||||
ALTER TABLE `cloud`.`volumes` ADD COLUMN `last_pool_id` bigint unsigned;
|
||||
UPDATE `cloud`.`volumes` SET `last_pool_id` = `pool_id`;
|
||||
UPDATE `cloud`.`volumes` SET `path` = SUBSTRING_INDEX(`path`, '/', -1);
|
||||
|
||||
ALTER TABLE `cloud`.`user_ip_address` ADD COLUMN `is_system` int(1) unsigned NOT NULL default '0';
|
||||
ALTER TABLE `cloud`.`volumes` ADD COLUMN `update_count` bigint unsigned NOT NULL DEFAULT 0;
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ class Services:
|
|||
"cpunumber": 1,
|
||||
"cpuspeed": 100,
|
||||
# in MHz
|
||||
"memory": 64,
|
||||
"memory": 128,
|
||||
# In MBs
|
||||
},
|
||||
"virtual_machine": {
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ class Services:
|
|||
"displaytext": "Tiny Instance",
|
||||
"cpunumber": 1,
|
||||
"cpuspeed": 100, # in MHz
|
||||
"memory": 64, # In MBs
|
||||
"memory": 128, # In MBs
|
||||
},
|
||||
"disk_offering": {
|
||||
"displaytext": "Small",
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ class Services:
|
|||
"displaytext": "Tiny Instance",
|
||||
"cpunumber": 1,
|
||||
"cpuspeed": 100, # in MHz
|
||||
"memory": 64, # In MBs
|
||||
"memory": 128, # In MBs
|
||||
},
|
||||
"disk_offering": {
|
||||
"displaytext": "Small",
|
||||
|
|
|
|||
|
|
@ -69,7 +69,7 @@ class Services:
|
|||
"displaytext": "Tiny Instance",
|
||||
"cpunumber": 1,
|
||||
"cpuspeed": 100, # in MHz
|
||||
"memory": 64, # In MBs
|
||||
"memory": 128, # In MBs
|
||||
},
|
||||
"security_group": {
|
||||
"name": 'SSH',
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ class Services:
|
|||
"displaytext": "Tiny Instance",
|
||||
"cpunumber": 1,
|
||||
"cpuspeed": 100, # in MHz
|
||||
"memory": 64, # In MBs
|
||||
"memory": 128, # In MBs
|
||||
},
|
||||
"lbrule": {
|
||||
"name": "SSH",
|
||||
|
|
|
|||
|
|
@ -368,3 +368,62 @@ class TestMultipleIpRanges(cloudstackTestCase):
|
|||
#Test will reach here there is a bug in overlap ip range checking
|
||||
self.fail("CS should not accept overlapped ip ranges in guest traffic, but it allowed")
|
||||
return
|
||||
|
||||
|
||||
@attr(tags=["advanced_sg", "sg"])
|
||||
def test_06_add_ip_range_overlapped_with_two_ranges(self):
|
||||
"""Test adding overlapped ip range in existing cidr
|
||||
|
||||
1.Add ip range in new cidr e.g:10.147.40.2-10.147.40.10
|
||||
2.Add another ip range in the same cidr e.g:10.147.40.20-10.147.40.30
|
||||
2.Add ip range overlapped with both the ip ranges e.g.10.147.40.10-20
|
||||
"""
|
||||
#call increment_cidr function to get exiting cidr from the setup and increment it
|
||||
ip2 = self.increment_cidr()
|
||||
test_nw = ip2.network
|
||||
ip = IPAddress(test_nw)
|
||||
#Add IP range in the new CIDR
|
||||
test_gateway = ip.__add__(1)
|
||||
test_startIp = ip.__add__(2)
|
||||
test_endIp = ip.__add__(10)
|
||||
test_startIp2 = ip.__add__(20)
|
||||
test_endIp2 = ip.__add__(30)
|
||||
test_startIp3 = ip.__add__(10)
|
||||
test_endIp3 = ip.__add__(20)
|
||||
#Populating services with new IP range
|
||||
self.services["vlan_ip_range"]["startip"] = test_startIp
|
||||
self.services["vlan_ip_range"]["endip"] = test_endIp
|
||||
self.services["vlan_ip_range"]["gateway"] = test_gateway
|
||||
self.services["vlan_ip_range"]["netmask"] = self.netmask
|
||||
self.services["vlan_ip_range"]["zoneid"] = self.zone.id
|
||||
self.services["vlan_ip_range"]["podid"] = self.pod.id
|
||||
#create new vlan ip range
|
||||
new_vlan = PublicIpRange.create(self.apiclient, self.services["vlan_ip_range"])
|
||||
self.debug("Created new vlan range with startip:%s and endip:%s" %(test_startIp,test_endIp))
|
||||
self.cleanup.append(new_vlan)
|
||||
new_vlan_res = new_vlan.list(self.apiclient,id=new_vlan.vlan.id)
|
||||
#Compare list output with configured values
|
||||
self.verify_vlan_range(new_vlan_res,self.services["vlan_ip_range"])
|
||||
#Add 2nd IP range in the same CIDR
|
||||
self.services["vlan_ip_range"]["startip"] = test_startIp2
|
||||
self.services["vlan_ip_range"]["endip"] = test_endIp2
|
||||
new_vlan = PublicIpRange.create(self.apiclient, self.services["vlan_ip_range"])
|
||||
self.debug("Created new vlan range with startip:%s and endip:%s" %(test_startIp2,test_endIp2))
|
||||
self.cleanup.append(new_vlan)
|
||||
new_vlan_res = new_vlan.list(self.apiclient,id=new_vlan.vlan.id)
|
||||
#Compare list output with configured values
|
||||
self.verify_vlan_range(new_vlan_res,self.services["vlan_ip_range"])
|
||||
#Add ip range which will overlap with two existing ip ranges in the same CIDR
|
||||
#Populating services with new IP range
|
||||
self.services["vlan_ip_range"]["startip"] = test_startIp3
|
||||
self.services["vlan_ip_range"]["endip"] = test_endIp3
|
||||
#Try to create ip range overlapped with exiting ip range
|
||||
try:
|
||||
PublicIpRange.create(self.apiclient, self.services["vlan_ip_range"])
|
||||
except cloudstackAPIException as cs:
|
||||
self.debug(cs.errorMsg)
|
||||
self.assertTrue(cs.errorMsg.find("already has IPs that overlap with the new range")>0, msg="Fail:CS allowed adding overlapped ip ranges in guest cidr")
|
||||
return
|
||||
#Test will reach here there is a bug in overlap ip range checking
|
||||
self.fail("CS should not accept overlapped ip ranges in guest traffic, but it allowed")
|
||||
return
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ class Services:
|
|||
"displaytext": "Tiny Instance",
|
||||
"cpunumber": 1,
|
||||
"cpuspeed": 100, # in MHz
|
||||
"memory": 64, # In MBs
|
||||
"memory": 128, # In MBs
|
||||
},
|
||||
"network_offering": {
|
||||
"name": 'Network offering-VR services',
|
||||
|
|
|
|||
|
|
@ -70,7 +70,7 @@ class Services:
|
|||
"displaytext": "Tiny Instance",
|
||||
"cpunumber": 1,
|
||||
"cpuspeed": 100, # in MHz
|
||||
"memory": 64, # In MBs
|
||||
"memory": 128, # In MBs
|
||||
},
|
||||
"virtual_machine": {
|
||||
"displayname": "Test VM",
|
||||
|
|
@ -242,8 +242,8 @@ class TestUserProjectCreation(cloudstackTestCase):
|
|||
project = Project.create(
|
||||
self.apiclient,
|
||||
self.services["project"],
|
||||
account=self.user.account.name,
|
||||
domainid=self.user.account.domainid
|
||||
account=self.user.name,
|
||||
domainid=self.user.domainid
|
||||
)
|
||||
# Cleanup created project at end of test
|
||||
self.cleanup.append(project)
|
||||
|
|
@ -409,11 +409,11 @@ class TestProjectCreationNegative(cloudstackTestCase):
|
|||
project = Project.create(
|
||||
self.apiclient,
|
||||
self.services["project"],
|
||||
account=self.user.account.name,
|
||||
domainid=self.user.account.domainid
|
||||
account=self.user.name,
|
||||
domainid=self.user.domainid
|
||||
)
|
||||
self.debug("Project creation with domain user: %s failed" %
|
||||
self.user.account.name)
|
||||
self.user.name)
|
||||
return
|
||||
|
||||
|
||||
|
|
@ -531,21 +531,21 @@ class TestProjectInviteRequired(cloudstackTestCase):
|
|||
"Check project name from list response"
|
||||
)
|
||||
self.debug("Adding %s user to project: %s" % (
|
||||
self.user.account.name,
|
||||
self.user.name,
|
||||
project.name
|
||||
))
|
||||
# Add user to the project
|
||||
project.addAccount(
|
||||
self.apiclient,
|
||||
self.user.account.name,
|
||||
self.user.account.email
|
||||
self.user.name,
|
||||
self.user.email
|
||||
)
|
||||
|
||||
# listProjectAccount to verify the user is added to project or not
|
||||
accounts_reponse = Project.listAccounts(
|
||||
self.apiclient,
|
||||
projectid=project.id,
|
||||
account=self.user.account.name,
|
||||
account=self.user.name,
|
||||
)
|
||||
self.debug(accounts_reponse)
|
||||
self.assertEqual(
|
||||
|
|
@ -684,22 +684,22 @@ class TestProjectInviteRequiredTrue(cloudstackTestCase):
|
|||
"Check project name from list response"
|
||||
)
|
||||
self.debug("Adding %s user to project: %s" % (
|
||||
self.user.account.name,
|
||||
self.user.name,
|
||||
project.name
|
||||
))
|
||||
# Add user to the project
|
||||
project.addAccount(
|
||||
self.apiclient,
|
||||
self.user.account.name,
|
||||
self.user.account.email
|
||||
self.user.name,
|
||||
self.user.email
|
||||
)
|
||||
|
||||
# listProjectAccount to verify the user is added to project or not
|
||||
accounts_reponse = ProjectInvitation.list(
|
||||
self.apiclient,
|
||||
state='Pending',
|
||||
account=self.user.account.name,
|
||||
domainid=self.user.account.domainid
|
||||
account=self.user.name,
|
||||
domainid=self.user.domainid
|
||||
)
|
||||
self.assertEqual(
|
||||
isinstance(accounts_reponse, list),
|
||||
|
|
@ -853,22 +853,22 @@ class TestProjectInviteTimeout(cloudstackTestCase):
|
|||
"Check project name from list response"
|
||||
)
|
||||
self.debug("Adding %s user to project: %s" % (
|
||||
self.user.account.name,
|
||||
self.user.name,
|
||||
project.name
|
||||
))
|
||||
# Add user to the project
|
||||
project.addAccount(
|
||||
self.apiclient,
|
||||
self.user.account.name,
|
||||
self.user.account.email
|
||||
self.user.name,
|
||||
self.user.email
|
||||
)
|
||||
|
||||
# listProjectAccount to verify the user is added to project or not
|
||||
accounts_reponse = ProjectInvitation.list(
|
||||
self.apiclient,
|
||||
state='Pending',
|
||||
account=self.user.account.name,
|
||||
domainid=self.user.account.domainid
|
||||
account=self.user.name,
|
||||
domainid=self.user.domainid
|
||||
)
|
||||
self.assertEqual(
|
||||
isinstance(accounts_reponse, list),
|
||||
|
|
@ -894,18 +894,18 @@ class TestProjectInviteTimeout(cloudstackTestCase):
|
|||
self.apiclient,
|
||||
projectid=project.id,
|
||||
accept=True,
|
||||
account=self.user.account.name
|
||||
account=self.user.name
|
||||
)
|
||||
self.debug(
|
||||
"Accepting project invitation for project: %s user: %s" % (
|
||||
project.name,
|
||||
self.user.account.name
|
||||
self.user.name
|
||||
))
|
||||
# listProjectAccount to verify the user is added to project or not
|
||||
accounts_reponse = Project.listAccounts(
|
||||
self.apiclient,
|
||||
projectid=project.id,
|
||||
account=self.user.account.name,
|
||||
account=self.user.name,
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
|
|
@ -979,22 +979,22 @@ class TestProjectInviteTimeout(cloudstackTestCase):
|
|||
"Check project name from list response"
|
||||
)
|
||||
self.debug("Adding %s user to project: %s" % (
|
||||
self.user.account.name,
|
||||
self.user.name,
|
||||
project.name
|
||||
))
|
||||
# Add user to the project
|
||||
project.addAccount(
|
||||
self.apiclient,
|
||||
self.user.account.name,
|
||||
self.user.account.email
|
||||
self.user.name,
|
||||
self.user.email
|
||||
)
|
||||
|
||||
# listProjectAccount to verify the user is added to project or not
|
||||
accounts_reponse = ProjectInvitation.list(
|
||||
self.apiclient,
|
||||
state='Pending',
|
||||
account=self.user.account.name,
|
||||
domainid=self.user.account.domainid
|
||||
account=self.user.name,
|
||||
domainid=self.user.domainid
|
||||
)
|
||||
self.assertEqual(
|
||||
isinstance(accounts_reponse, list),
|
||||
|
|
@ -1025,18 +1025,18 @@ class TestProjectInviteTimeout(cloudstackTestCase):
|
|||
self.apiclient,
|
||||
projectid=project.id,
|
||||
accept=True,
|
||||
account=self.user.account.name
|
||||
account=self.user.name
|
||||
)
|
||||
self.debug(
|
||||
"Accepting invitation after expiry project: %s user: %s" % (
|
||||
project.name,
|
||||
self.user.account.name
|
||||
self.user.name
|
||||
))
|
||||
# listProjectAccount to verify the user is added to project or not
|
||||
accounts_reponse = ProjectInvitation.list(
|
||||
self.apiclient,
|
||||
account=self.user.account.name,
|
||||
domainid=self.user.account.domainid
|
||||
account=self.user.name,
|
||||
domainid=self.user.domainid
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
|
|
@ -1110,22 +1110,22 @@ class TestProjectInviteTimeout(cloudstackTestCase):
|
|||
"Check project name from list response"
|
||||
)
|
||||
self.debug("Adding %s user to project: %s" % (
|
||||
self.user.account.name,
|
||||
self.user.name,
|
||||
project.name
|
||||
))
|
||||
# Add user to the project
|
||||
project.addAccount(
|
||||
self.apiclient,
|
||||
self.user.account.name,
|
||||
self.user.account.email
|
||||
self.user.name,
|
||||
self.user.email
|
||||
)
|
||||
|
||||
# listProjectAccount to verify the user is added to project or not
|
||||
accounts_reponse = ProjectInvitation.list(
|
||||
self.apiclient,
|
||||
state='Pending',
|
||||
account=self.user.account.name,
|
||||
domainid=self.user.account.domainid
|
||||
account=self.user.name,
|
||||
domainid=self.user.domainid
|
||||
)
|
||||
self.assertEqual(
|
||||
isinstance(accounts_reponse, list),
|
||||
|
|
@ -1151,22 +1151,22 @@ class TestProjectInviteTimeout(cloudstackTestCase):
|
|||
time.sleep(int(self.config.value) * 2)
|
||||
|
||||
self.debug("Adding %s user again to project: %s" % (
|
||||
self.user.account.name,
|
||||
self.user.name,
|
||||
project.name
|
||||
))
|
||||
# Add user to the project
|
||||
project.addAccount(
|
||||
self.apiclient,
|
||||
self.user.account.name,
|
||||
self.user.account.email
|
||||
self.user.name,
|
||||
self.user.email
|
||||
)
|
||||
|
||||
# listProjectAccount to verify the user is added to project or not
|
||||
accounts_reponse = ProjectInvitation.list(
|
||||
self.apiclient,
|
||||
state='Pending',
|
||||
account=self.user.account.name,
|
||||
domainid=self.user.account.domainid
|
||||
account=self.user.name,
|
||||
domainid=self.user.domainid
|
||||
)
|
||||
self.assertEqual(
|
||||
isinstance(accounts_reponse, list),
|
||||
|
|
@ -1239,22 +1239,22 @@ class TestProjectInviteTimeout(cloudstackTestCase):
|
|||
"Check project name from list response"
|
||||
)
|
||||
self.debug("Adding %s user to project: %s" % (
|
||||
self.user.account.name,
|
||||
self.user.name,
|
||||
project.name
|
||||
))
|
||||
# Add user to the project
|
||||
project.addAccount(
|
||||
self.apiclient,
|
||||
self.user.account.name,
|
||||
self.user.account.email
|
||||
self.user.name,
|
||||
self.user.email
|
||||
)
|
||||
|
||||
# listProjectAccount to verify the user is added to project or not
|
||||
accounts_reponse = ProjectInvitation.list(
|
||||
self.apiclient,
|
||||
state='Pending',
|
||||
account=self.user.account.name,
|
||||
domainid=self.user.account.domainid
|
||||
account=self.user.name,
|
||||
domainid=self.user.domainid
|
||||
)
|
||||
self.assertEqual(
|
||||
isinstance(accounts_reponse, list),
|
||||
|
|
@ -1279,18 +1279,18 @@ class TestProjectInviteTimeout(cloudstackTestCase):
|
|||
self.apiclient,
|
||||
projectid=project.id,
|
||||
accept=False,
|
||||
account=self.user.account.name
|
||||
account=self.user.name
|
||||
)
|
||||
self.debug(
|
||||
"Declining invitation for project: %s user: %s" % (
|
||||
project.name,
|
||||
self.user.account.name
|
||||
self.user.name
|
||||
))
|
||||
# listProjectAccount to verify the user is added to project or not
|
||||
accounts_reponse = Project.listAccounts(
|
||||
self.apiclient,
|
||||
projectid=project.id,
|
||||
account=self.user.account.name,
|
||||
account=self.user.name,
|
||||
)
|
||||
self.assertEqual(
|
||||
accounts_reponse,
|
||||
|
|
@ -1367,19 +1367,19 @@ class TestProjectInviteTimeout(cloudstackTestCase):
|
|||
"Check project name from list response"
|
||||
)
|
||||
self.debug("Adding user with email: %s to project: %s" % (
|
||||
self.user.account.email,
|
||||
self.user.email,
|
||||
project.name
|
||||
))
|
||||
|
||||
# Add user to the project
|
||||
project.addAccount(
|
||||
self.apiclient,
|
||||
email=self.user.account.user[0].email
|
||||
email=self.user.user[0].email
|
||||
)
|
||||
|
||||
# Fetch the latest mail sent to user
|
||||
mail_content = fetch_latest_mail(
|
||||
self.services["mail_account"],
|
||||
from_mail=self.user.account.user[0].email
|
||||
from_mail=self.user.user[0].email
|
||||
)
|
||||
return
|
||||
|
|
|
|||
|
|
@ -63,7 +63,7 @@ class Services:
|
|||
"displaytext": "Tiny Instance",
|
||||
"cpunumber": 1,
|
||||
"cpuspeed": 100, # in MHz
|
||||
"memory": 64, # In MBs
|
||||
"memory": 128, # In MBs
|
||||
},
|
||||
"disk_offering": {
|
||||
"displaytext": "Tiny Disk Offering",
|
||||
|
|
@ -429,14 +429,14 @@ class TestProjectLimits(cloudstackTestCase):
|
|||
)
|
||||
|
||||
self.debug("Adding %s user to project: %s" % (
|
||||
self.user.account.name,
|
||||
self.user.name,
|
||||
project.name
|
||||
))
|
||||
|
||||
# Add user to the project
|
||||
project.addAccount(
|
||||
self.apiclient,
|
||||
self.user.account.name,
|
||||
self.user.name,
|
||||
)
|
||||
|
||||
# Get the resource limits for domain
|
||||
|
|
@ -459,14 +459,14 @@ class TestProjectLimits(cloudstackTestCase):
|
|||
#with self.assertRaises(Exception):
|
||||
self.debug(
|
||||
"Attempting to update resource limit by user: %s" % (
|
||||
self.user.account.name
|
||||
self.user.name
|
||||
))
|
||||
# Update project resource limits to 3
|
||||
update_resource_limit(
|
||||
self.apiclient,
|
||||
resource.resourcetype,
|
||||
account=self.user.account.name,
|
||||
domainid=self.user.account.domainid,
|
||||
account=self.user.name,
|
||||
domainid=self.user.domainid,
|
||||
max=3,
|
||||
projectid=project.id
|
||||
)
|
||||
|
|
|
|||
|
|
@ -64,7 +64,7 @@ class Services:
|
|||
"displaytext": "Tiny Instance",
|
||||
"cpunumber": 1,
|
||||
"cpuspeed": 100, # in MHz
|
||||
"memory": 64, # In MBs
|
||||
"memory": 128, # In MBs
|
||||
},
|
||||
"disk_offering": {
|
||||
"displaytext": "Tiny Disk Offering",
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ class Services:
|
|||
"displaytext": "Tiny Instance",
|
||||
"cpunumber": 1,
|
||||
"cpuspeed": 100, # in MHz
|
||||
"memory": 64, # In MBs
|
||||
"memory": 128, # In MBs
|
||||
},
|
||||
"disk_offering": {
|
||||
"displaytext": "Small",
|
||||
|
|
|
|||
|
|
@ -78,7 +78,7 @@ class Services:
|
|||
"displaytext": "Tiny Instance",
|
||||
"cpunumber": 1,
|
||||
"cpuspeed": 100, # in MHz
|
||||
"memory": 64, # In MBs
|
||||
"memory": 128, # In MBs
|
||||
},
|
||||
"virtual_machine": {
|
||||
"displayname": "Test VM",
|
||||
|
|
@ -248,15 +248,15 @@ class TestMultipleProjectCreation(cloudstackTestCase):
|
|||
# Add user to the project
|
||||
project_1.addAccount(
|
||||
self.apiclient,
|
||||
self.user.account.name,
|
||||
self.user.account.email
|
||||
self.user.name,
|
||||
self.user.email
|
||||
)
|
||||
|
||||
# listProjectAccount to verify the user is added to project or not
|
||||
accounts_reponse = Project.listAccounts(
|
||||
self.apiclient,
|
||||
projectid=project_1.id,
|
||||
account=self.user.account.name,
|
||||
account=self.user.name,
|
||||
)
|
||||
self.debug(accounts_reponse)
|
||||
self.assertEqual(
|
||||
|
|
@ -280,15 +280,15 @@ class TestMultipleProjectCreation(cloudstackTestCase):
|
|||
# Add user to the project
|
||||
project_2.addAccount(
|
||||
self.apiclient,
|
||||
self.user.account.name,
|
||||
self.user.account.email
|
||||
self.user.name,
|
||||
self.user.email
|
||||
)
|
||||
|
||||
# listProjectAccount to verify the user is added to project or not
|
||||
accounts_reponse = Project.listAccounts(
|
||||
self.apiclient,
|
||||
projectid=project_2.id,
|
||||
account=self.user.account.name,
|
||||
account=self.user.name,
|
||||
)
|
||||
self.debug(accounts_reponse)
|
||||
self.assertEqual(
|
||||
|
|
@ -432,15 +432,15 @@ class TestCrossDomainAccountAdd(cloudstackTestCase):
|
|||
)
|
||||
|
||||
self.debug("Adding user: %s from domain: %s to project: %s" % (
|
||||
self.user.account.name,
|
||||
self.user.account.domainid,
|
||||
self.user.name,
|
||||
self.user.domainid,
|
||||
project.id
|
||||
))
|
||||
with self.assertRaises(Exception):
|
||||
# Add user to the project from different domain
|
||||
project.addAccount(
|
||||
self.apiclient,
|
||||
self.user.account.name
|
||||
self.user.name
|
||||
)
|
||||
self.debug("User add to project failed!")
|
||||
return
|
||||
|
|
@ -938,7 +938,7 @@ class TestProjectOwners(cloudstackTestCase):
|
|||
)
|
||||
self.cleanup.append(self.user)
|
||||
self.debug("Created account with ID: %s" %
|
||||
self.user.account.name)
|
||||
self.user.name)
|
||||
|
||||
list_projects_reponse = Project.list(
|
||||
self.apiclient,
|
||||
|
|
@ -1033,20 +1033,20 @@ class TestProjectOwners(cloudstackTestCase):
|
|||
)
|
||||
|
||||
self.debug("Adding %s user to project: %s" % (
|
||||
self.user.account.name,
|
||||
self.user.name,
|
||||
project.name
|
||||
))
|
||||
# Add user to the project
|
||||
project.addAccount(
|
||||
self.apiclient,
|
||||
self.user.account.name,
|
||||
self.user.name,
|
||||
)
|
||||
|
||||
# listProjectAccount to verify the user is added to project or not
|
||||
accounts_reponse = Project.listAccounts(
|
||||
self.apiclient,
|
||||
projectid=project.id,
|
||||
account=self.user.account.name,
|
||||
account=self.user.name,
|
||||
)
|
||||
self.assertEqual(
|
||||
isinstance(accounts_reponse, list),
|
||||
|
|
@ -1068,19 +1068,19 @@ class TestProjectOwners(cloudstackTestCase):
|
|||
)
|
||||
|
||||
self.debug("Updating project with new Admin: %s" %
|
||||
self.user.account.name)
|
||||
self.user.name)
|
||||
|
||||
# Update the project with new admin
|
||||
project.update(
|
||||
self.apiclient,
|
||||
account=self.user.account.name
|
||||
account=self.user.name
|
||||
)
|
||||
|
||||
# listProjectAccount to verify the user is new admin of the project
|
||||
accounts_reponse = Project.listAccounts(
|
||||
self.apiclient,
|
||||
projectid=project.id,
|
||||
account=self.user.account.name,
|
||||
account=self.user.name,
|
||||
)
|
||||
self.debug(accounts_reponse)
|
||||
self.assertEqual(
|
||||
|
|
@ -1248,20 +1248,20 @@ class TestProjectResources(cloudstackTestCase):
|
|||
"Check project name from list response"
|
||||
)
|
||||
self.debug("Adding %s user to project: %s" % (
|
||||
self.user.account.name,
|
||||
self.user.name,
|
||||
project.name
|
||||
))
|
||||
# Add user to the project
|
||||
project.addAccount(
|
||||
self.apiclient,
|
||||
self.user.account.name,
|
||||
self.user.name,
|
||||
)
|
||||
|
||||
# listProjectAccount to verify the user is added to project or not
|
||||
accounts_reponse = Project.listAccounts(
|
||||
self.apiclient,
|
||||
projectid=project.id,
|
||||
account=self.user.account.name,
|
||||
account=self.user.name,
|
||||
)
|
||||
self.assertEqual(
|
||||
isinstance(accounts_reponse, list),
|
||||
|
|
@ -1370,20 +1370,20 @@ class TestProjectResources(cloudstackTestCase):
|
|||
)
|
||||
self.cleanup.append(self.user)
|
||||
self.debug("Adding %s user to project: %s" % (
|
||||
self.user.account.name,
|
||||
self.user.name,
|
||||
project.name
|
||||
))
|
||||
# Add user to the project
|
||||
project.addAccount(
|
||||
self.apiclient,
|
||||
self.user.account.name
|
||||
self.user.name
|
||||
)
|
||||
|
||||
# listProjectAccount to verify the user is added to project or not
|
||||
accounts_reponse = Project.listAccounts(
|
||||
self.apiclient,
|
||||
projectid=project.id,
|
||||
account=self.user.account.name,
|
||||
account=self.user.name,
|
||||
)
|
||||
self.assertEqual(
|
||||
isinstance(accounts_reponse, list),
|
||||
|
|
@ -1543,20 +1543,20 @@ class TestProjectSuspendActivate(cloudstackTestCase):
|
|||
# account deletion.
|
||||
|
||||
self.debug("Adding %s user to project: %s" % (
|
||||
self.user.account.name,
|
||||
self.user.name,
|
||||
self.project.name
|
||||
))
|
||||
# Add user to the project
|
||||
self.project.addAccount(
|
||||
self.apiclient,
|
||||
self.user.account.name,
|
||||
self.user.name,
|
||||
)
|
||||
|
||||
# listProjectAccount to verify the user is added to project or not
|
||||
accounts_reponse = Project.listAccounts(
|
||||
self.apiclient,
|
||||
projectid=self.project.id,
|
||||
account=self.user.account.name,
|
||||
account=self.user.name,
|
||||
)
|
||||
self.assertEqual(
|
||||
isinstance(accounts_reponse, list),
|
||||
|
|
|
|||
|
|
@ -0,0 +1,140 @@
|
|||
#!/usr/bin/env python
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from marvin.cloudstackTestCase import *
|
||||
from marvin.cloudstackAPI import *
|
||||
from marvin.integration.lib.utils import *
|
||||
from marvin.integration.lib.base import *
|
||||
from marvin.integration.lib.common import *
|
||||
from nose.plugins.attrib import attr
|
||||
from random import choice
|
||||
|
||||
class Services:
|
||||
def __init__(self):
|
||||
self.services = {
|
||||
"region": {
|
||||
"regionid": "2",
|
||||
"regionname": "Region2",
|
||||
"regionendpoint": "http://region2:8080/client"
|
||||
}
|
||||
}
|
||||
|
||||
class TestRegions(cloudstackTestCase):
|
||||
"""Test Regions - CRUD tests for regions
|
||||
"""
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
cls.api_client = super(TestRegions, cls).getClsTestClient().getApiClient()
|
||||
cls.services = Services().services
|
||||
cls.domain = get_domain(cls.api_client, cls.services)
|
||||
cls.cleanup = []
|
||||
return
|
||||
|
||||
def setUp(self):
|
||||
pseudo_random_int = choice(xrange(1, 200))
|
||||
self.services["region"]["regionid"] = pseudo_random_int
|
||||
self.services["region"]["regionname"] = "region" + str(pseudo_random_int)
|
||||
self.services["region"]["regionendpoint"] = "http://region" + str(pseudo_random_int) + ":8080/client"
|
||||
|
||||
self.region = Region.create(self.api_client,
|
||||
self.services["region"]
|
||||
)
|
||||
self.cleanup = []
|
||||
self.cleanup.append(self.region)
|
||||
|
||||
list_region = Region.list(self.api_client,
|
||||
id=self.services["region"]["regionid"]
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
isinstance(list_region, list),
|
||||
True,
|
||||
msg="Region creation failed"
|
||||
)
|
||||
|
||||
@attr(tags=["simulator", "basic", "advanced"])
|
||||
def test_createRegionWithExistingRegionId(self):
|
||||
"""Test for duplicate checks on region id
|
||||
"""
|
||||
self.services["region"]["regionname"] = random_gen() #alter region name but not id
|
||||
self.assertRaises(Exception, Region.create, self.api_client, self.services["region"])
|
||||
|
||||
@attr(tags=["simulator", "basic", "advanced"])
|
||||
def test_createRegionWithExistingRegionName(self):
|
||||
"""Test for duplicate checks on region name
|
||||
"""
|
||||
random_int = choice(xrange(1, 200))
|
||||
self.services["region"]["regionid"] = random_int #alter id but not name
|
||||
self.services["region"]["regionendpoint"] = "http://region" + str(random_int) + ":8080/client"
|
||||
self.assertRaises(Exception, Region.create, self.api_client, self.services["region"])
|
||||
|
||||
@attr(tags=["simulator", "basic", "advanced"])
|
||||
def test_updateRegion(self):
|
||||
""" Test for update Region
|
||||
"""
|
||||
self.services["region"]["regionname"] = "Region3" + random_gen()
|
||||
self.services["region"]["regionendpoint"] = "http://region3updated:8080/client"
|
||||
|
||||
updated_region = self.region.update(self.api_client,
|
||||
self.services["region"]
|
||||
)
|
||||
|
||||
list_region = Region.list(self.api_client,
|
||||
id=self.services["region"]["regionid"]
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
isinstance(list_region, list),
|
||||
True,
|
||||
"Check for list Region response"
|
||||
)
|
||||
region_response = list_region[0]
|
||||
|
||||
self.assertEqual(
|
||||
region_response.id,
|
||||
updated_region.id,
|
||||
"listRegion response does not match with region Id created"
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
region_response.name,
|
||||
updated_region.name,
|
||||
"listRegion response does not match with region name created"
|
||||
)
|
||||
self.assertEqual(
|
||||
region_response.endpoint,
|
||||
updated_region.endpoint,
|
||||
"listRegion response does not match with region endpoint created"
|
||||
)
|
||||
|
||||
def tearDown(self):
|
||||
""" Test for delete region as cleanup
|
||||
"""
|
||||
try:
|
||||
#Clean up
|
||||
cleanup_resources(self.api_client, self.cleanup)
|
||||
except Exception as e:
|
||||
raise Exception("Warning: Exception during cleanup : %s" % e)
|
||||
|
||||
@classmethod
|
||||
def tearDownClass(cls):
|
||||
"""
|
||||
Nothing to do
|
||||
"""
|
||||
pass
|
||||
|
|
@ -0,0 +1,206 @@
|
|||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from marvin.cloudstackTestCase import *
|
||||
from marvin.cloudstackAPI import *
|
||||
from marvin.integration.lib.utils import *
|
||||
from marvin.integration.lib.base import *
|
||||
from marvin.integration.lib.common import *
|
||||
from nose.plugins.attrib import attr
|
||||
|
||||
class Services:
|
||||
def __init__(self):
|
||||
self.services = {
|
||||
"domain": {
|
||||
"name": "testuuid",
|
||||
"domainUUID": "domain1"
|
||||
},
|
||||
"account": {
|
||||
"email": "test@test.com",
|
||||
"firstname": "Testuuid",
|
||||
"lastname": "Useruuid",
|
||||
"username": "test",
|
||||
"password": "password",
|
||||
"accountUUID": "account1",
|
||||
"userUUID": "user1"
|
||||
},
|
||||
"user": {
|
||||
"email": "test@test.com",
|
||||
"firstname": "Testuuid",
|
||||
"lastname": "Useruuid",
|
||||
"username": "test",
|
||||
"password": "password",
|
||||
"userUUID": "user2"
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
class TestRegionsAccounts(cloudstackTestCase):
|
||||
"""Test Accounts in Regions - CRUD tests for accounts in regions
|
||||
"""
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
cls.api_client = super(TestRegionsAccounts, cls).getClsTestClient().getApiClient()
|
||||
cls.services = Services().services
|
||||
cls.domain = get_domain(cls.api_client, cls.services)
|
||||
cls.cleanup = []
|
||||
return
|
||||
|
||||
@attr(tags=["simulator", "basic", "advanced"])
|
||||
def test_createAccountWithUUID(self):
|
||||
"""Test for creating account by passing id parameter
|
||||
|
||||
# Validate the following
|
||||
# 1.Create an Account by passing id parameter.Verify the account is created.
|
||||
# 2.List this account by passing id parameter.Verify that list account is able to lis this account.
|
||||
# 3.Delete account should succeed.
|
||||
"""
|
||||
account = Account.create(
|
||||
self.api_client,
|
||||
self.services["account"],
|
||||
domainid=self.domain.id
|
||||
)
|
||||
self.assertIn(self.services["account"]["accountUUID"], account.id,
|
||||
"Account is not created with the accountId passed")
|
||||
|
||||
list_account = Account.list(self.api_client,
|
||||
id=account.id)
|
||||
|
||||
self.assertEqual(
|
||||
isinstance(list_account, list),
|
||||
True,
|
||||
"Check for list account response by uuid failed"
|
||||
)
|
||||
|
||||
account_response = list_account[0]
|
||||
self.assertEqual(account_response.id,
|
||||
account.id,
|
||||
"listAccount response does not match with account Id "
|
||||
)
|
||||
self.assertEqual(
|
||||
account_response.user[0].firstname,
|
||||
self.services["account"]["firstname"],
|
||||
"listAccount response does not match with account firstname"
|
||||
)
|
||||
|
||||
self.cleanup.append(account)
|
||||
return
|
||||
|
||||
@attr(tags=["simulator", "basic", "advanced"])
|
||||
def test_createUserWithUUID(self):
|
||||
"""Test for creating User by passing id parameter
|
||||
|
||||
# Validate the following
|
||||
# 1.Create a User by passing id parameter.Verify the user is created.
|
||||
# 2.List this user by passing id parameter.Verify that list user is able to list this user.
|
||||
# 3.Delete User should succeed.
|
||||
"""
|
||||
|
||||
user = User.create(
|
||||
self.api_client,
|
||||
self.services["user"],
|
||||
account="admin",
|
||||
domainid=self.domain.id
|
||||
)
|
||||
self.assertIn(self.services["user"]["userUUID"], user.id,
|
||||
"User is not created successfully with the userId passed")
|
||||
|
||||
list_user = User.list(self.api_client, id=user.id)
|
||||
|
||||
self.assertEqual(
|
||||
isinstance(list_user, list),
|
||||
True,
|
||||
"Check for list user response by uuid failed"
|
||||
)
|
||||
|
||||
user_response = list_user[0]
|
||||
|
||||
self.assertEqual(user_response.id,
|
||||
user.id,
|
||||
"list User response does not match with user Id "
|
||||
)
|
||||
self.assertEqual(
|
||||
user_response.firstname,
|
||||
self.services["user"]["firstname"],
|
||||
"listUser response does not match with user firstname"
|
||||
)
|
||||
|
||||
user.delete(self.api_client)
|
||||
|
||||
list_user = User.list(self.api_client,
|
||||
id=user.id
|
||||
)
|
||||
|
||||
self.assertIsNone(
|
||||
list_user,
|
||||
"Deletion of user failed"
|
||||
)
|
||||
return
|
||||
|
||||
@attr(tags=["simulator", "basic", "advanced"])
|
||||
def test_createdomainWithUUID(self):
|
||||
"""Test for creating Domain by passing id parameter
|
||||
|
||||
# Validate the following
|
||||
# 1.Create a domain by passing id parameter.Verify the domain is created.
|
||||
# 2.List this domain by passing id parameter.Verify that list domain is able to list this domain.
|
||||
# 3.Delete domain should succeed.
|
||||
"""
|
||||
|
||||
domain = Domain.create(
|
||||
self.api_client,
|
||||
self.services["domain"]
|
||||
)
|
||||
|
||||
self.assertIn(self.services["domain"]["domainUUID"], domain.id,
|
||||
"Domain is not created with the doaminId passed")
|
||||
|
||||
list_domain = Domain.list(self.api_client,
|
||||
id=domain.id
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
isinstance(list_domain, list),
|
||||
True,
|
||||
"Check for list domain response by uuid failed"
|
||||
)
|
||||
|
||||
domain_response = list_domain[0]
|
||||
|
||||
self.assertEqual(domain_response.id,
|
||||
domain.id,
|
||||
"list domain response does not match with domain Id "
|
||||
)
|
||||
self.assertIn(
|
||||
self.services["domain"]["name"],
|
||||
domain_response.name,
|
||||
"list domaiin response does not match with user firstname"
|
||||
)
|
||||
try:
|
||||
domain.delete(self.api_client)
|
||||
except Exception as e:
|
||||
self.fail("Failed to delete domain: %s" % e)
|
||||
return
|
||||
|
||||
@classmethod
|
||||
def tearDownClass(cls):
|
||||
try:
|
||||
#Clean up
|
||||
cleanup_resources(cls.api_client, cls.cleanup)
|
||||
except Exception as e:
|
||||
raise Exception("Warning: Exception during cleanup : %s" % e)
|
||||
|
|
@ -51,7 +51,7 @@ class Services:
|
|||
"cpunumber": 1,
|
||||
"cpuspeed": 100,
|
||||
# in MHz
|
||||
"memory": 64,
|
||||
"memory": 128,
|
||||
# In MBs
|
||||
},
|
||||
"disk_offering": {
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ class Services:
|
|||
"displaytext": "Tiny Instance",
|
||||
"cpunumber": 1,
|
||||
"cpuspeed": 100, # in MHz
|
||||
"memory": 64, # In MBs
|
||||
"memory": 128, # In MBs
|
||||
},
|
||||
"virtual_machine":
|
||||
{
|
||||
|
|
|
|||
|
|
@ -74,7 +74,7 @@ class Services:
|
|||
"displaytext": "Tiny Instance",
|
||||
"cpunumber": 1,
|
||||
"cpuspeed": 100, # in MHz
|
||||
"memory": 64, # In MBs
|
||||
"memory": 128, # In MBs
|
||||
},
|
||||
"security_group": {
|
||||
"name": 'SSH',
|
||||
|
|
|
|||
|
|
@ -98,16 +98,16 @@ class TestStorageMotion(cloudstackTestCase):
|
|||
|
||||
# Get Zone, Domain and templates
|
||||
domain = get_domain(cls.api_client, cls.services)
|
||||
zone = get_zone(cls.api_client, cls.services)
|
||||
cls.zone = get_zone(cls.api_client, cls.services)
|
||||
cls.services['mode'] = cls.zone.networktype
|
||||
|
||||
template = get_template(
|
||||
cls.api_client,
|
||||
zone.id,
|
||||
cls.zone.id,
|
||||
cls.services["ostype"]
|
||||
)
|
||||
# Set Zones and disk offerings
|
||||
cls.services["small"]["zoneid"] = zone.id
|
||||
cls.services["small"]["zoneid"] = cls.zone.id
|
||||
cls.services["small"]["template"] = template.id
|
||||
|
||||
# Create VMs, NAT Rules etc
|
||||
|
|
@ -258,6 +258,17 @@ class TestStorageMotion(cloudstackTestCase):
|
|||
self.apiclient,
|
||||
id=volume.id
|
||||
)
|
||||
self.assertEqual(
|
||||
isinstance(pools, list),
|
||||
True,
|
||||
"Check list storage pools response for valid list"
|
||||
)
|
||||
self.assertNotEqual(
|
||||
pools,
|
||||
None,
|
||||
"Check if pools exists in ListStoragePools"
|
||||
)
|
||||
|
||||
pool = pools[0]
|
||||
self.debug("Migrating Volume-ID: %s to Pool: %s" % (
|
||||
volume.id,
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ class Services:
|
|||
"displaytext": "Tiny Instance",
|
||||
"cpunumber": 1,
|
||||
"cpuspeed": 100, # in MHz
|
||||
"memory": 64, # In MBs
|
||||
"memory": 128, # In MBs
|
||||
},
|
||||
"disk_offering": {
|
||||
"displaytext": "Small",
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ class Services:
|
|||
"displaytext": "Tiny Instance",
|
||||
"cpunumber": 1,
|
||||
"cpuspeed": 100, # in MHz
|
||||
"memory": 64, # In MBs
|
||||
"memory": 128, # In MBs
|
||||
},
|
||||
"disk_offering": {
|
||||
"displaytext": "Small",
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@ class Services:
|
|||
"displaytext": "Tiny Instance",
|
||||
"cpunumber": 1,
|
||||
"cpuspeed": 100, # in MHz
|
||||
"memory": 64, # In MBs
|
||||
"memory": 128, # In MBs
|
||||
},
|
||||
"disk_offering": {
|
||||
"displaytext": "Small",
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@ class Services:
|
|||
"cpunumber": 1,
|
||||
"cpuspeed": 100,
|
||||
# in MHz
|
||||
"memory": 64,
|
||||
"memory": 128,
|
||||
# In MBs
|
||||
},
|
||||
"ostype": 'CentOS 5.3 (64-bit)',
|
||||
|
|
|
|||
|
|
@ -111,6 +111,7 @@ class TestDeployVmWithUserData(cloudstackTestCase):
|
|||
vm = vms[0]
|
||||
self.assert_(vm.id == str(deployVmResponse.id), "Vm deployed is different from the test")
|
||||
self.assert_(vm.state == "Running", "VM is not in Running state")
|
||||
self.cleanup.append(deployVmResponse)
|
||||
|
||||
@attr(tags=["simulator", "devcloud", "basic", "advanced"])
|
||||
def test_deployvm_userdata(self):
|
||||
|
|
@ -134,6 +135,7 @@ class TestDeployVmWithUserData(cloudstackTestCase):
|
|||
vm = vms[0]
|
||||
self.assert_(vm.id == str(deployVmResponse.id), "Vm deployed is different from the test")
|
||||
self.assert_(vm.state == "Running", "VM is not in Running state")
|
||||
self.cleanup.append(deployVmResponse)
|
||||
|
||||
@classmethod
|
||||
def tearDownClass(cls):
|
||||
|
|
|
|||
|
|
@ -44,7 +44,8 @@ class Services:
|
|||
"password": "password",
|
||||
},
|
||||
"name": "testphysicalnetwork",
|
||||
"vlan": "118-120",
|
||||
|
||||
"vlan": "2118-2120",
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -149,6 +150,7 @@ class TestDedicateGuestVlanRange(cloudstackTestCase):
|
|||
)
|
||||
|
||||
self.debug("Releasing guest vlan range");
|
||||
<<<<<<< HEAD
|
||||
dedicated_guest_vlan_response.release(self.apiclient)
|
||||
list_dedicated_guest_vlan_range_response = PhysicalNetwork.listDedicated(
|
||||
self.apiclient,
|
||||
|
|
@ -160,4 +162,14 @@ class TestDedicateGuestVlanRange(cloudstackTestCase):
|
|||
"system",
|
||||
"Check account name is system account in listDedicatedGuestVlanRanges"
|
||||
)
|
||||
=======
|
||||
dedicate_guest_vlan_range_response.release(self.apiclient)
|
||||
list_dedicated_guest_vlan_range_response = PhysicalNetwork.listDedicated(self.apiclient)
|
||||
self.assertEqual(
|
||||
list_dedicated_guest_vlan_range_response,
|
||||
None,
|
||||
"Check vlan range is not available in listDedicatedGuestVlanRanges"
|
||||
|
||||
)
|
||||
>>>>>>> master
|
||||
|
||||
|
|
|
|||
|
|
@ -151,8 +151,8 @@ class TestPublicIP(cloudstackTestCase):
|
|||
cls.user_network = Network.create(
|
||||
cls.api_client,
|
||||
cls.services["network"],
|
||||
cls.user.account.name,
|
||||
cls.user.account.domainid
|
||||
cls.user.name,
|
||||
cls.user.domainid
|
||||
)
|
||||
|
||||
# Create Source NAT IP addresses
|
||||
|
|
@ -164,9 +164,9 @@ class TestPublicIP(cloudstackTestCase):
|
|||
)
|
||||
user_src_nat_ip = PublicIPAddress.create(
|
||||
cls.api_client,
|
||||
cls.user.account.name,
|
||||
cls.user.name,
|
||||
cls.zone.id,
|
||||
cls.user.account.domainid
|
||||
cls.user.domainid
|
||||
)
|
||||
cls._cleanup = [
|
||||
cls.account_network,
|
||||
|
|
@ -248,9 +248,9 @@ class TestPublicIP(cloudstackTestCase):
|
|||
|
||||
ip_address = PublicIPAddress.create(
|
||||
self.apiclient,
|
||||
self.user.account.name,
|
||||
self.user.name,
|
||||
self.zone.id,
|
||||
self.user.account.domainid
|
||||
self.user.domainid
|
||||
)
|
||||
|
||||
#listPublicIpAddresses should return newly created public IP
|
||||
|
|
|
|||
|
|
@ -0,0 +1,93 @@
|
|||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from marvin.cloudstackTestCase import *
|
||||
from marvin.cloudstackAPI import *
|
||||
from marvin.integration.lib.utils import *
|
||||
from marvin.integration.lib.base import *
|
||||
from marvin.integration.lib.common import *
|
||||
from nose.plugins.attrib import attr
|
||||
|
||||
class Services:
|
||||
def __init__(self):
|
||||
self.services = {
|
||||
"region": {
|
||||
"regionid": "2",
|
||||
"regionname": "Region2",
|
||||
"regionendpoint": "http://region2:8080/client"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class TestRegions(cloudstackTestCase):
|
||||
"""Test Regions - basic region creation
|
||||
"""
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
cls.api_client = super(TestRegions, cls).getClsTestClient().getApiClient()
|
||||
cls.services = Services().services
|
||||
cls.domain = get_domain(cls.api_client, cls.services)
|
||||
cls.cleanup = []
|
||||
|
||||
@attr(tags=["simulator", "basic", "advanced"])
|
||||
def test_createRegion(self):
|
||||
""" Test for create region
|
||||
"""
|
||||
region = Region.create(self.api_client,
|
||||
self.services["region"]
|
||||
)
|
||||
|
||||
list_region = Region.list(self.api_client,
|
||||
id=self.services["region"]["regionid"]
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
isinstance(list_region, list),
|
||||
True,
|
||||
"Check for list Region response"
|
||||
)
|
||||
region_response = list_region[0]
|
||||
|
||||
self.assertEqual(
|
||||
str(region_response.id),
|
||||
self.services["region"]["regionid"],
|
||||
"listRegion response does not match with region Id created"
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
region_response.name,
|
||||
self.services["region"]["regionname"],
|
||||
"listRegion response does not match with region name created"
|
||||
)
|
||||
self.assertEqual(
|
||||
region_response.endpoint,
|
||||
self.services["region"]["regionendpoint"],
|
||||
"listRegion response does not match with region endpoint created"
|
||||
)
|
||||
self.cleanup.append(region)
|
||||
return
|
||||
|
||||
@classmethod
|
||||
def tearDownClass(cls):
|
||||
try:
|
||||
#Clean up
|
||||
cleanup_resources(cls.api_client, cls.cleanup)
|
||||
list_region = Region.list(cls.api_client, id=cls.services["region"]["regionid"])
|
||||
assert list_region is None, "Region deletion fails"
|
||||
except Exception as e:
|
||||
raise Exception("Warning: Region cleanup/delete fails with : %s" % e)
|
||||
|
|
@ -292,6 +292,7 @@ class TestTemplates(cloudstackTestCase):
|
|||
# Get Zone, Domain and templates
|
||||
cls.domain = get_domain(cls.api_client, cls.services)
|
||||
cls.zone = get_zone(cls.api_client, cls.services)
|
||||
cls.services['mode'] = cls.zone.networktype
|
||||
#populate second zone id for iso copy
|
||||
cmd = listZones.listZonesCmd()
|
||||
zones = cls.api_client.listZones(cmd)
|
||||
|
|
@ -751,8 +752,8 @@ class TestTemplates(cloudstackTestCase):
|
|||
list_template_response = list_templates(
|
||||
self.apiclient,
|
||||
templatefilter='featured',
|
||||
account=self.user.account.name,
|
||||
domainid=self.user.account.domainid
|
||||
account=self.user.name,
|
||||
domainid=self.user.domainid
|
||||
)
|
||||
self.assertEqual(
|
||||
isinstance(list_template_response, list),
|
||||
|
|
@ -783,8 +784,8 @@ class TestTemplates(cloudstackTestCase):
|
|||
list_template_response = list_templates(
|
||||
self.apiclient,
|
||||
templatefilter='featured',
|
||||
account=self.user.account.name,
|
||||
domainid=self.user.account.domainid
|
||||
account=self.user.name,
|
||||
domainid=self.user.domainid
|
||||
)
|
||||
self.assertEqual(
|
||||
isinstance(list_template_response, list),
|
||||
|
|
|
|||
|
|
@ -287,6 +287,7 @@ class TestVolumes(cloudstackTestCase):
|
|||
# Get Zone, Domain and templates
|
||||
cls.domain = get_domain(cls.api_client, cls.services)
|
||||
cls.zone = get_zone(cls.api_client, cls.services)
|
||||
cls.services['mode'] = cls.zone.networktype
|
||||
cls.disk_offering = DiskOffering.create(
|
||||
cls.api_client,
|
||||
cls.services["disk_offering"]
|
||||
|
|
|
|||
|
|
@ -40,6 +40,9 @@ class Domain:
|
|||
|
||||
cmd = createDomain.createDomainCmd()
|
||||
|
||||
if "domainUUID" in services:
|
||||
cmd.domainid = "-".join([services["domainUUID"], random_gen()])
|
||||
|
||||
if name:
|
||||
cmd.name = "-".join([name, random_gen()])
|
||||
elif "name" in services:
|
||||
|
|
@ -97,6 +100,13 @@ class Account:
|
|||
cmd.password = services["password"]
|
||||
cmd.username = "-".join([services["username"], random_gen()])
|
||||
|
||||
if "accountUUID" in services:
|
||||
cmd.accountid = "-".join([services["accountUUID"],random_gen()])
|
||||
|
||||
if "userUUID" in services:
|
||||
cmd.userid = "-".join([services["userUUID"],random_gen()])
|
||||
|
||||
|
||||
if domainid:
|
||||
cmd.domainid = domainid
|
||||
account = apiclient.createAccount(cmd)
|
||||
|
|
@ -135,6 +145,9 @@ class User:
|
|||
cmd.firstname = services["firstname"]
|
||||
cmd.lastname = services["lastname"]
|
||||
|
||||
if "userUUID" in services:
|
||||
cmd.userid = "-".join([services["userUUID"],random_gen()])
|
||||
|
||||
# Password Encoding
|
||||
mdf = hashlib.md5()
|
||||
mdf.update(services["password"])
|
||||
|
|
@ -2202,7 +2215,7 @@ class PhysicalNetwork:
|
|||
|
||||
cmd = listDedicatedGuestVlanRanges.listDedicatedGuestVlanRangesCmd()
|
||||
[setattr(cmd, k, v) for k, v in kwargs.items()]
|
||||
return map(lambda pn : PhysicalNetwork(pn.__dict__), apiclient.listDedicatedGuestVlanRanges(cmd))
|
||||
return apiclient.listDedicatedGuestVlanRanges(cmd)
|
||||
|
||||
@classmethod
|
||||
def list(cls, apiclient, **kwargs):
|
||||
|
|
@ -3108,3 +3121,44 @@ class VmSnapshot:
|
|||
cmd.vmsnapshotid = vmsnapshotid
|
||||
|
||||
return apiclient.deleteVMSnapshot(cmd)
|
||||
|
||||
class Region:
|
||||
""" Regions related Api """
|
||||
def __init__(self, items):
|
||||
self.__dict__.update(items)
|
||||
|
||||
@classmethod
|
||||
def create(cls, apiclient, services):
|
||||
cmd = addRegion.addRegionCmd()
|
||||
cmd.id = services["regionid"]
|
||||
cmd.endpoint = services["regionendpoint"]
|
||||
cmd.name = services["regionname"]
|
||||
try:
|
||||
region = apiclient.addRegion(cmd)
|
||||
if region is not None:
|
||||
return Region(region.__dict__)
|
||||
except Exception as e:
|
||||
raise e
|
||||
|
||||
@classmethod
|
||||
def list(cls, apiclient, **kwargs):
|
||||
cmd = listRegions.listRegionsCmd()
|
||||
[setattr(cmd, k, v) for k, v in kwargs.items()]
|
||||
region = apiclient.listRegions(cmd)
|
||||
return region
|
||||
|
||||
def update(self, apiclient, services):
|
||||
cmd = updateRegion.updateRegionCmd()
|
||||
cmd.id = self.id
|
||||
if services["regionendpoint"]:
|
||||
cmd.endpoint = services["regionendpoint"]
|
||||
if services["regionname"]:
|
||||
cmd.name = services["regionname"]
|
||||
region = apiclient.updateRegion(cmd)
|
||||
return region
|
||||
|
||||
def delete(self, apiclient):
|
||||
cmd = removeRegion.removeRegionCmd()
|
||||
cmd.id = self.id
|
||||
region = apiclient.removeRegion(cmd)
|
||||
return region
|
||||
|
|
|
|||
|
|
@ -20,15 +20,20 @@
|
|||
}
|
||||
|
||||
var loadCSS = function(path) {
|
||||
var $link = $('<link>');
|
||||
if (document.createStyleSheet) {
|
||||
// IE-compatible CSS loading
|
||||
document.createStyleSheet(path);
|
||||
} else {
|
||||
var $link = $('<link>');
|
||||
|
||||
$link.attr({
|
||||
rel: 'stylesheet',
|
||||
type: 'text/css',
|
||||
href: path
|
||||
});
|
||||
$link.attr({
|
||||
rel: 'stylesheet',
|
||||
type: 'text/css',
|
||||
href: path
|
||||
});
|
||||
|
||||
$('head').append($link);
|
||||
$('html head').append($link);
|
||||
}
|
||||
};
|
||||
|
||||
$.extend(cloudStack.pluginAPI, {
|
||||
|
|
|
|||
|
|
@ -1018,12 +1018,7 @@
|
|||
dataType: "json",
|
||||
success: function(json) {
|
||||
var jobId = json.updatephysicalnetworkresponse.jobid;
|
||||
|
||||
var trafficType = getTrafficType(selectedPhysicalNetworkObj, 'Guest');
|
||||
|
||||
updateTrafficLabels(trafficType, args.data, function() {
|
||||
args.response.success({ _custom: { jobId: jobId }});
|
||||
});
|
||||
},
|
||||
|
||||
error:function(json){
|
||||
|
|
@ -1071,10 +1066,7 @@
|
|||
dataType: "json",
|
||||
success: function(json) {
|
||||
var jobId = json.updatephysicalnetworkresponse.jobid;
|
||||
var trafficType = getTrafficType(selectedPhysicalNetworkObj, 'Guest');
|
||||
updateTrafficLabels(trafficType, args.data, function() {
|
||||
args.response.success({ _custom: { jobId: jobId }});
|
||||
});
|
||||
},
|
||||
|
||||
error:function(json){
|
||||
|
|
|
|||
|
|
@ -546,10 +546,15 @@ public class VsmCommand {
|
|||
vmware.appendChild(portgroup);
|
||||
portProf.appendChild(vmware);
|
||||
|
||||
// org root/%vdc%
|
||||
// org %vdc%
|
||||
// vservice node <Node Name> profile <Edge Security Profile Name in VNMC>
|
||||
Element vdcValue = doc.createElement(s_paramvalue);
|
||||
vdcValue.setAttribute("isKey", "true");
|
||||
vdcValue.setTextContent(vdc);
|
||||
|
||||
Element org = doc.createElement("org");
|
||||
org.appendChild(doc.createElement(vdc));
|
||||
org.appendChild(doc.createElement("orgname"))
|
||||
.appendChild(vdcValue);
|
||||
portProf.appendChild(org);
|
||||
|
||||
String asaNodeName = "ASA_" + vlanid;
|
||||
|
|
|
|||
Loading…
Reference in New Issue