This commit is contained in:
Ewan Mellor 2012-05-16 12:04:59 -07:00
commit cdc4836ca2
22 changed files with 159 additions and 194 deletions

View File

@ -299,7 +299,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements
protected String _linkLocalBridgeName;
protected String _publicBridgeName;
protected String _guestBridgeName;
protected String _privateBridgeIp;
protected String _privateIp;
protected String _pool;
protected String _localGateway;
private boolean _can_bridge_firewall;
@ -1805,7 +1805,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements
try {
Connect conn = LibvirtConnection.getConnection();
Integer vncPort = getVncPort(conn, cmd.getName());
return new GetVncPortAnswer(cmd, 5900 + vncPort);
return new GetVncPortAnswer(cmd, _privateIp, 5900 + vncPort);
} catch (Exception e) {
return new GetVncPortAnswer(cmd, e.toString());
}
@ -2618,19 +2618,16 @@ public class LibvirtComputingResource extends ServerResourceBase implements
}
} else {
int devId = (int) volume.getDeviceId();
if (pool.getType() == StoragePoolType.CLVM) {
disk.defBlockBasedDisk(physicalDisk.getPath(), devId,
diskBusType);
if (volume.getType() == Volume.Type.DATADISK) {
disk.defFileBasedDisk(physicalDisk.getPath(), devId,
DiskDef.diskBus.VIRTIO,
DiskDef.diskFmtType.QCOW2);
} else {
if (volume.getType() == Volume.Type.DATADISK) {
disk.defFileBasedDisk(physicalDisk.getPath(), devId,
DiskDef.diskBus.VIRTIO,
DiskDef.diskFmtType.QCOW2);
} else {
disk.defFileBasedDisk(physicalDisk.getPath(), devId,
diskBusType, DiskDef.diskFmtType.QCOW2);
}
disk.defFileBasedDisk(physicalDisk.getPath(), devId,
diskBusType, DiskDef.diskFmtType.QCOW2);
}
}
vm.getDevices().addDevice(disk);
@ -2682,12 +2679,10 @@ public class LibvirtComputingResource extends ServerResourceBase implements
/* add patch disk */
DiskDef patchDisk = new DiskDef();
if (pool.getType() == StoragePoolType.CLVM) {
patchDisk.defBlockBasedDisk(datadiskPath, 1, rootDisk.getBusType());
} else {
patchDisk.defFileBasedDisk(datadiskPath, 1, rootDisk.getBusType(),
DiskDef.diskFmtType.RAW);
}
patchDisk.defFileBasedDisk(datadiskPath, 1, rootDisk.getBusType(),
DiskDef.diskFmtType.RAW);
disks.add(patchDisk);
String bootArgs = vmSpec.getBootArgs();
@ -2972,6 +2967,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements
RouterPrivateIpStrategy.HostLocal);
cmd.setStateChanges(changes);
fillNetworkInformation(cmd);
_privateIp = cmd.getPrivateIpAddress();
cmd.getHostDetails().putAll(getVersionStrings());
cmd.setPool(_pool);
cmd.setCluster(_clusterId);

View File

@ -71,15 +71,9 @@ public class KVMStoragePoolManager {
public KVMPhysicalDisk createDiskFromTemplate(KVMPhysicalDisk template,
String name, KVMStoragePool destPool) {
if (destPool.getType() == StoragePoolType.CLVM) {
return this._storageAdaptor.createDiskFromTemplate(template, name,
KVMPhysicalDisk.PhysicalDiskFormat.RAW, template.getSize(),
destPool);
} else {
return this._storageAdaptor.createDiskFromTemplate(template, name,
KVMPhysicalDisk.PhysicalDiskFormat.QCOW2,
template.getSize(), destPool);
}
return this._storageAdaptor.createDiskFromTemplate(template, name,
KVMPhysicalDisk.PhysicalDiskFormat.QCOW2,
template.getSize(), destPool);
}
public KVMPhysicalDisk createTemplateFromDisk(KVMPhysicalDisk disk,

View File

@ -418,19 +418,11 @@ public class LibvirtStorageAdaptor implements StorageAdaptor {
if (spd.getPoolType() == LibvirtStoragePoolDef.poolType.NETFS
|| spd.getPoolType() == LibvirtStoragePoolDef.poolType.DIR) {
type = StoragePoolType.Filesystem;
} else if (spd.getPoolType() == LibvirtStoragePoolDef.poolType.LOGICAL) {
type = StoragePoolType.CLVM;
}
LibvirtStoragePool pool = new LibvirtStoragePool(uuid,
storage.getName(), type, this, storage);
pool.setLocalPath(spd.getTargetPath());
if (pool.getType() == StoragePoolType.CLVM) {
pool.setCapacity(storage.getInfo().capacity);
pool.setUsed(storage.getInfo().allocation);
} else {
getStats(pool);
}
getStats(pool);
return pool;
} catch (LibvirtException e) {
throw new CloudRuntimeException(e.toString());
@ -491,8 +483,6 @@ public class LibvirtStorageAdaptor implements StorageAdaptor {
} else if (type == StoragePoolType.SharedMountPoint
|| type == StoragePoolType.Filesystem) {
sp = CreateSharedStoragePool(conn, name, host, path);
} else if (type == StoragePoolType.CLVM) {
sp = createCLVMStoragePool(conn, name, host, path);
}
}
@ -507,12 +497,8 @@ public class LibvirtStorageAdaptor implements StorageAdaptor {
sp.getName(), type, this, sp);
pool.setLocalPath(spd.getTargetPath());
if (pool.getType() == StoragePoolType.CLVM) {
pool.setCapacity(sp.getInfo().capacity);
pool.setUsed(sp.getInfo().allocation);
} else {
getStats(pool);
}
getStats(pool);
return pool;
} catch (LibvirtException e) {
throw new CloudRuntimeException(e.toString());

View File

@ -79,11 +79,7 @@ public class LibvirtStoragePool implements KVMStoragePool {
@Override
public PhysicalDiskFormat getDefaultFormat() {
if (getStoragePoolType() == StoragePoolType.CLVM) {
return PhysicalDiskFormat.RAW;
} else {
return PhysicalDiskFormat.QCOW2;
}
return PhysicalDiskFormat.QCOW2;
}
@Override

View File

@ -92,7 +92,6 @@ public class Storage {
Iscsi(true), // for e.g., ZFS Comstar
ISO(false), // for iso image
LVM(false), // XenServer local LVM SR
CLVM(true),
SharedMountPoint(true),
VMFS(true), // VMware VMFS storage
PreSetup(true), // for XenServer, Storage Pool is set up by customers.

View File

@ -821,11 +821,26 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe
protected VDI mount(Connection conn, String vmName, VolumeTO volume) throws XmlRpcException, XenAPIException {
if (volume.getType() == Volume.Type.ISO) {
String isopath = volume.getPath();
if (isopath == null) {
return null;
}
if (isopath.startsWith("xs-tools")) {
try {
Set<VDI> vdis = VDI.getByNameLabel(conn, isopath);
if (vdis.isEmpty()) {
throw new CloudRuntimeException("Could not find ISO with URL: " + isopath);
}
return vdis.iterator().next();
String isopath = volume.getPath();
if (isopath == null) {
return null;
}
} catch (XenAPIException e) {
throw new CloudRuntimeException("Unable to get pv iso: " + isopath + " due to " + e.toString());
} catch (Exception e) {
throw new CloudRuntimeException("Unable to get pv iso: " + isopath + " due to " + e.toString());
}
}
int index = isopath.lastIndexOf("/");
String mountpoint = isopath.substring(0, index);

View File

@ -43,61 +43,7 @@ create_snapshot() {
local snapshotname="$2"
local failed=0
if [ -b "${disk}" ] && lvm lvs "${disk}" >/dev/null 2>&1; then
local lv=$( lvm lvs --noheadings --unbuffered --separator=/ "${disk}" 2>/dev/null | sed 's|^[[:space:]]\+||' )
local lvname=$( echo "${lv}" | awk -F/ '{ print $1 }' )
local vgname=$( echo "${lv}" | awk -F/ '{ print $2 }' )
local lvdmname=$( echo "${lvname}" | sed 's|-|--|g' )
local vgdmname=$( echo "${vgname}" | sed 's|-|--|g' )
local blockdevname="/dev/mapper/${vgdmname}-${lvdmname}"
local blockdevsnap="/dev/mapper/${vgdmname}-${snapshotname}"
local blockdevsize=$( blockdev --getsz "${blockdevname}" )
lvm lvcreate --name "${snapshotname}-cow" --size "$(blockdev --getsize64 ${blockdevname})b" "${vgname}" >&2 || return 1
dmsetup suspend "${vgdmname}-${lvdmname}" >&2
[ $? -ne 0 ] && destroy_snapshot "${disk}" "${snapshotname}" && return 1
if dmsetup table | awk -v e=1 -v tbl="${vgdmname}-${lvdmname}-real:" '$1 == tbl { e=0 }; END { exit e }'; then
dmsetup create "${vgdmname}-${snapshotname}" --notable >&2
[ $? -ne 0 ] && destroy_snapshot "${disk}" "${snapshotname}" && return 1
echo "0 ${blockdevsize} snapshot ${blockdevname}-real ${blockdevsnap}--cow p 64" | \
dmsetup load "${vgdmname}-${snapshotname}" >&2
[ $? -ne 0 ] && destroy_snapshot "${disk}" "${snapshotname}" && return 1
dmsetup resume "${vgdmname}-${snapshotname}" >&2
[ $? -ne 0 ] && destroy_snapshot "${disk}" "${snapshotname}" && return 1
else
dmsetup create "${vgdmname}-${lvdmname}-real" --notable >&2
[ $? -ne 0 ] && destroy_snapshot "${disk}" "${snapshotname}" && return 1
dmsetup table "${vgdmname}-${lvdmname}" | dmsetup load "${vgdmname}-${lvdmname}-real" >&2
[ $? -ne 0 ] && destroy_snapshot "${disk}" "${snapshotname}" && return 1
dmsetup resume "${vgdmname}-${lvdmname}-real" >&2
[ $? -ne 0 ] && destroy_snapshot "${disk}" "${snapshotname}" && return 1
dmsetup create "${vgdmname}-${snapshotname}" --notable >&2
[ $? -ne 0 ] && destroy_snapshot "${disk}" "${snapshotname}" && return 1
echo "0 ${blockdevsize} snapshot ${blockdevname}-real ${blockdevsnap}--cow p 64" | \
dmsetup load "${vgdmname}-${snapshotname}" >&2
[ $? -ne 0 ] && destroy_snapshot "${disk}" "${snapshotname}" && return 1
echo "0 ${blockdevsize} snapshot-origin ${blockdevname}-real" | \
dmsetup load "${vgdmname}-${lvdmname}"
[ $? -ne 0 ] && destroy_snapshot "${disk}" "${snapshotname}" && return 1
dmsetup resume "${vgdmname}-${snapshotname}" >&2
[ $? -ne 0 ] && destroy_snapshot "${disk}" "${snapshotname}" && return 1
fi
dmsetup resume "${vgdmname}-${lvdmname}" >&2
[ $? -ne 0 ] && destroy_snapshot "${disk}" "${snapshotname}" && return 1
elif [ -f "${disk}" ]; then
if [ -f "${disk}" ]; then
$qemu_img snapshot -c "$snapshotname" $disk
@ -124,24 +70,8 @@ destroy_snapshot() {
local disk=$1
local snapshotname=$2
local failed=0
if [ -b ${disk} ]; then
local lvname=$( echo "${disk}" | awk -F/ '{ print $(NF) }' ) # '
local vgname=$( echo "${disk}" | awk -F/ '{ print $(NF-1) }' ) # '
local lvdmname=$( echo "${lvname}" | sed 's|-|--|g' )
local vgdmname=$( echo "${vgname}" | sed 's|-|--|g' )
if [ $( dmsetup --columns --noheadings --separator=: info "${vgdmname}-${lvdmname}-real" | awk -F: '{ print $5 }' ) -le 2 ]; then
dmsetup suspend "${vgdmname}-${lvdmname}" >&2
dmsetup table "${vgdmname}-${lvdmname}-real" | dmsetup load "${vgdmname}-${lvdmname}" >&2
dmsetup resume "${vgdmname}-${lvdmname}" >&2
dmsetup remove "${vgdmname}-${snapshotname}" >&2
dmsetup remove "${vgdmname}-${lvdmname}-real" >&2
else
dmsetup remove "${vgdmname}-${snapshotname}" >&2
fi
lvm lvremove -f "${vgname}/${snapshotname}-cow" >&2
elif [ -f $disk ]; then
if [ -f $disk ]; then
$qemu_img snapshot -d "$snapshotname" $disk
if [ $? -gt 0 ]
then
@ -186,18 +116,7 @@ backup_snapshot() {
fi
fi
if [ -b ${disk} ] && lvm lvs "${disk}" >/dev/null 2>&1; then
local lv=$( lvm lvs --noheadings --unbuffered --separator=/ "${disk}" 2>/dev/null | sed 's|^[[:space:]]\+||' )
local vgname=$( echo "${lv}" | awk -F/ '{ print $2 }' )
local vgdmname=$( echo "${vgname}" | sed 's|-|--|g' )
if [ -x "$( dirname $0 )/raw2qcow2.sh" ]; then
"$( dirname $0 )/raw2qcow2.sh" "/dev/mapper/${vgdmname}-${snapshotname}" "${destPath}/${destName}"
else
$qemu_img convert -f raw -O qcow2 "/dev/mapper/${vgdmname}-${snapshotname}" "${destPath}/${destName}"
fi
return 0
elif [ -f ${disk} ]; then
if [ -f ${disk} ]; then
# Does the snapshot exist?
$qemu_img snapshot -l $disk|grep -w "$snapshotname" >& /dev/null
if [ $? -gt 0 ]

View File

@ -114,6 +114,7 @@ import com.cloud.dc.VlanVO;
import com.cloud.domain.Domain;
import com.cloud.event.Event;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.exception.PermissionDeniedException;
import com.cloud.host.Host;
import com.cloud.host.HostStats;
import com.cloud.host.HostVO;
@ -158,6 +159,7 @@ import com.cloud.storage.Snapshot;
import com.cloud.storage.Storage.ImageFormat;
import com.cloud.storage.Storage.StoragePoolType;
import com.cloud.storage.Storage.TemplateType;
import com.cloud.storage.Storage;
import com.cloud.storage.StoragePool;
import com.cloud.storage.StoragePoolVO;
import com.cloud.storage.StorageStats;
@ -1099,9 +1101,15 @@ public class ApiResponseHelper implements ResponseGenerator {
}
volResponse.setAttached(volume.getAttached());
volResponse.setDestroyed(volume.getState() == Volume.State.Destroy);
VMTemplateVO template = ApiDBUtils.findTemplateById(volume.getTemplateId());
boolean isExtractable = template != null && template.isExtractable() && !(template.getTemplateType() == TemplateType.SYSTEM);
volResponse.setDestroyed(volume.getState() == Volume.State.Destroy);
boolean isExtractable = true;
if (volume.getVolumeType() != Volume.Type.DATADISK) { // Datadisk dont have any template dependence.
VMTemplateVO template = ApiDBUtils.findTemplateById(volume.getTemplateId());
if (template != null) { // For ISO based volumes template = null and we allow extraction of all ISO based volumes
isExtractable = template.isExtractable() && template.getTemplateType() != Storage.TemplateType.SYSTEM;
}
}
volResponse.setExtractable(isExtractable);
volResponse.setObjectName("volume");
return volResponse;

View File

@ -186,7 +186,7 @@ public enum Config {
UseLocalStorage("Advanced", ManagementServer.class, Boolean.class, "use.local.storage", "false", "Should we use the local storage if it's available?", null),
SecStorageVmMTUSize("Advanced", AgentManager.class, Integer.class, "secstorage.vm.mtu.size", String.valueOf(SecondaryStorageVmManager.DEFAULT_SS_VM_MTUSIZE), "MTU size (in Byte) of storage network in secondary storage vms", null),
MaxTemplateAndIsoSize("Advanced", ManagementServer.class, Long.class, "max.template.iso.size", "50", "The maximum size for a downloaded template or ISO (in GB).", null),
SecStorageAllowedInternalDownloadSites("Advanced", ManagementServer.class, String.class, "secstorage.allowed.internal.sites", null, "Comma separated list of cidrs internal to the datacenter that can host template download servers", null),
SecStorageAllowedInternalDownloadSites("Advanced", ManagementServer.class, String.class, "secstorage.allowed.internal.sites", null, "Comma separated list of cidrs internal to the datacenter that can host template download servers, please note 0.0.0.0 is not a valid site", null),
SecStorageEncryptCopy("Advanced", ManagementServer.class, Boolean.class, "secstorage.encrypt.copy", "false", "Use SSL method used to encrypt copy traffic between zones", "true,false"),
SecStorageSecureCopyCert("Advanced", ManagementServer.class, String.class, "secstorage.ssl.cert.domain", "realhostip.com", "SSL certificate used to encrypt copy traffic between zones", null),
SecStorageCapacityStandby("Advanced", AgentManager.class, Integer.class, "secstorage.capacity.standby", "10", "The minimal number of command execution sessions that system is able to serve immediately(standby capacity)", null),

View File

@ -1123,13 +1123,13 @@ public class ConsoleProxyManagerImpl implements ConsoleProxyManager, ConsoleProx
if (l != null && l.size() > 0 && l.get(0).second().intValue() > 0) {
return true;
} else {
if (s_logger.isTraceEnabled()) {
s_logger.trace("Primary storage is not ready, wait until it is ready to launch console proxy");
if (s_logger.isDebugEnabled()) {
s_logger.debug("Primary storage is not ready, wait until it is ready to launch console proxy");
}
}
} else {
if (s_logger.isTraceEnabled()) {
s_logger.trace("Zone host is ready, but console proxy template is not ready");
if (s_logger.isDebugEnabled()) {
s_logger.debug("Zone host is ready, but console proxy template: " + template.getId() + " is not ready on secondary storage: " + secondaryStorageHost.getId());
}
}
}

View File

@ -1294,8 +1294,6 @@ public class StorageManagerImpl implements StorageManager, Manager, ClusterManag
pool = new StoragePoolVO(StoragePoolType.Filesystem, "localhost", 0, hostPath);
} else if (scheme.equalsIgnoreCase("sharedMountPoint")) {
pool = new StoragePoolVO(StoragePoolType.SharedMountPoint, storageHost, 0, hostPath);
} else if (scheme.equalsIgnoreCase("clvm")) {
pool = new StoragePoolVO(StoragePoolType.CLVM, storageHost, 0, hostPath.replaceFirst("/", ""));
} else if (scheme.equalsIgnoreCase("PreSetup")) {
pool = new StoragePoolVO(StoragePoolType.PreSetup, storageHost, 0, hostPath);
} else if (scheme.equalsIgnoreCase("iscsi")) {
@ -1594,7 +1592,7 @@ public class StorageManagerImpl implements StorageManager, Manager, ClusterManag
s_logger.debug("creating pool " + pool.getName() + " on host " + hostId);
if (pool.getPoolType() != StoragePoolType.NetworkFilesystem && pool.getPoolType() != StoragePoolType.Filesystem && pool.getPoolType() != StoragePoolType.IscsiLUN
&& pool.getPoolType() != StoragePoolType.Iscsi && pool.getPoolType() != StoragePoolType.VMFS && pool.getPoolType() != StoragePoolType.SharedMountPoint
&& pool.getPoolType() != StoragePoolType.PreSetup && pool.getPoolType() != StoragePoolType.OCFS2 && pool.getPoolType() != StoragePoolType.CLVM) {
&& pool.getPoolType() != StoragePoolType.PreSetup && pool.getPoolType() != StoragePoolType.OCFS2) {
s_logger.warn(" Doesn't support storage pool type " + pool.getPoolType());
return false;
}

View File

@ -362,7 +362,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
List<String> allowedCidrs = new ArrayList<String>();
String[] cidrs = _allowedInternalSites.split(",");
for (String cidr : cidrs) {
if (NetUtils.isValidCIDR(cidr) || NetUtils.isValidIp(cidr)) {
if (NetUtils.isValidCIDR(cidr) || NetUtils.isValidIp(cidr) || !cidr.startsWith("0.0.0.0")) {
allowedCidrs.add(cidr);
}
}
@ -727,8 +727,8 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
}
}
} else {
if (s_logger.isTraceEnabled()) {
s_logger.trace("Zone host is ready, but secondary storage vm template is not ready");
if (s_logger.isDebugEnabled()) {
s_logger.debug("Zone host is ready, but secondary storage vm template: " + template.getId() + " is not ready on secondary storage: " + secHost.getId());
}
}
}

View File

@ -2549,11 +2549,15 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager
Pair<String, String> isoPathPair = _storageMgr.getAbsoluteIsoPath(template.getId(), vm.getDataCenterIdToDeployIn());
if (isoPathPair == null) {
s_logger.warn("Couldn't get absolute iso path");
return false;
if (template.getTemplateType() == TemplateType.PERHOST) {
isoPath = template.getName();
} else {
isoPath = isoPathPair.first();
if (isoPathPair == null) {
s_logger.warn("Couldn't get absolute iso path");
return false;
} else {
isoPath = isoPathPair.first();
}
}
if (template.isBootable()) {

View File

@ -59,7 +59,7 @@ CREATE TABLE `cloud`.`volume_host_ref` (
INDEX `i_volume_host_ref__volume_id`(`volume_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
INSERT IGNORE INTO `cloud`.`disk_offering` (name, display_text, customized, unique_name, disk_size, system_use) VALUES ( 'Custom', 'Custom Disk', 1, 'Cloud.com-Custom', 0, 0);
INSERT IGNORE INTO `cloud`.`disk_offering` (name, display_text, customized, unique_name, disk_size, system_use, type) VALUES ( 'Custom', 'Custom Disk', 1, 'Cloud.com-Custom', 0, 0, 'Disk');
INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Storage', 'DEFAULT', 'management-server', 'storage.max.volume.upload.size', 500, 'The maximum size for a uploaded volume(in GB).');
# Changes for OVS tunnel manager
@ -116,4 +116,4 @@ DELETE FROM `cloud`.`configuration` WHERE name='xen.max.version';
DELETE FROM `cloud`.`configuration` WHERE name='xen.max.xapi.version';
DELETE FROM `cloud`.`configuration` WHERE name='xen.min.product.version';
DELETE FROM `cloud`.`configuration` WHERE name='xen.min.version';
DELETE FROM `cloud`.`configuration` WHERE name='xen.min.xapi.version';
DELETE FROM `cloud`.`configuration` WHERE name='xen.min.xapi.version';

View File

@ -1680,6 +1680,15 @@ div.detail-group.actions td {
}
#header div.logo {
width: 170px;
height: 47px;
position: relative;
float: left;
margin: 4px 0 0 19px;
background: url(../images/logo-cloudplatform.png) no-repeat 0 center;
}
#header.nologo div.logo {
width: 170px;
height: 47px;
position: relative;

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 8.7 KiB

View File

@ -33,11 +33,7 @@
var allowedActions = args.context.actions;
var disallowedActions = [];
var item = args.context.item;
var status = item.state;
if (status == 'Released') {
return [];
}
var status = item.state;
if (status == 'Destroyed' ||
status == 'Releasing' ||
@ -46,9 +42,30 @@
status == 'Allocating' ||
item.account == 'system' ||
item.issystem == true ) {
disallowedActions = allowedActions;
return [];
}
if(item.networkOfferingConserveMode == false) {
/*
(1) If IP is SourceNat, no LoadBalancer/PortForwarding/VPN/StaticNat can be added/enabled.
*/
if (item.issourcenat == true){
disallowedActions.push('enableStaticNAT');
disallowedActions.push('enableVPN');
}
/*
(2) If IP is non-SourceNat, show LoadBalancer/PortForwarding/VPN/StaticNat at first.
1. Once a LoadBalancer rule is added, hide PortForwarding/VPN/StaticNat.
2. Once a PortForwarding rule is added, hide LoadBalancer/VPN/StaticNat.
3. Once VPN is enabled, hide LoadBalancer/PortForwarding/StaticNat.
4. Once StaticNat is enabled, hide LoadBalancer/PortForwarding/VPN.
*/
else { //item.issourcenat == false
//???
}
}
if (item.isstaticnat) {
disallowedActions.push('enableStaticNAT');
} else {
@ -1399,33 +1416,46 @@
$.ajax({
url: createURL('listPublicIpAddresses'),
data: {
id: args.id
id: args.context.ipAddresses[0].id
},
dataType: "json",
async: true,
success: function(json) {
var item = items[0];
// Get VPN data
$.ajax({
url: createURL('listRemoteAccessVpns'),
data: {
listAll: true,
publicipid: item.id
},
dataType: 'json',
async: true,
success: function(vpnResponse) {
var isVPNEnabled = vpnResponse.listremoteaccessvpnsresponse.count;
if (isVPNEnabled) {
item.vpnenabled = true;
item.remoteaccessvpn = vpnResponse.listremoteaccessvpnsresponse.remoteaccessvpn[0];
};
args.response.success({
actionFilter: actionFilters.ipAddress,
data: item
});
}
});
var ipObj = items[0];
$.ajax({
url: createURL('listNetworkOfferings'),
data: {
id: args.context.networks[0].networkofferingid
},
dataType: 'json',
async: true,
success: function(json) {
var networkOfferingObj = json.listnetworkofferingsresponse.networkoffering[0];
ipObj.networkOfferingConserveMode= networkOfferingObj.conservemode;
// Get VPN data
$.ajax({
url: createURL('listRemoteAccessVpns'),
data: {
listAll: true,
publicipid: ipObj.id
},
dataType: 'json',
async: true,
success: function(vpnResponse) {
var isVPNEnabled = vpnResponse.listremoteaccessvpnsresponse.count;
if (isVPNEnabled) {
ipObj.vpnenabled = true;
ipObj.remoteaccessvpn = vpnResponse.listremoteaccessvpnsresponse.remoteaccessvpn[0];
};
args.response.success({
actionFilter: actionFilters.ipAddress,
data: ipObj
});
}
});
}
});
},
error: function(data) {
args.response.error(parseXMLHttpResponse(data));
@ -1433,7 +1463,8 @@
});
}
},
ipRules: {
ipRules: { //Configuration tab
title: 'label.configuration',
custom: cloudStack.ipRules({
preFilter: function(args) {
@ -1462,6 +1493,17 @@
});
}
});
if(args.context.ipAddresses[0].networkOfferingConserveMode == false) {
/*
(1) If IP is SourceNat, no LoadBalancer/PortForwarding/VPN/StaticNat can be added/enabled.
*/
if (args.context.ipAddresses[0].issourcenat){
disallowedActions.push("loadBalancing");
disallowedActions.push("portForwarding");
}
}
if(networkOfferingHavingFirewallService == false)
disallowedActions.push("firewall");
if(networkOfferingHavingPortForwardingService == false)

View File

@ -602,7 +602,8 @@
$.ajax({
url: createURL('listVirtualMachines'),
data: $.extend(data, {
state: this.toString()
state: this.toString(),
hypervisor: args.context.volumes[0].hypervisor
}),
async: false,
success: function(json) {

View File

@ -7261,7 +7261,6 @@
var items = [];
items.push({id: "nfs", description: "nfs"});
items.push({id: "SharedMountPoint", description: "SharedMountPoint"});
items.push({id: "clvm", description: "CLVM"});
args.response.success({data: items});
}
else if(selectedClusterObj.hypervisortype == "XenServer") {

View File

@ -315,7 +315,7 @@
}
// Hide logo conditionally
if (!args.hasLogo) $('#header .controls').addClass('nologo');
if (!args.hasLogo) $('#header, #header .controls').addClass('nologo');
return this;
};

View File

@ -885,7 +885,6 @@
var items = [];
items.push({id: "nfs", description: "nfs"});
items.push({id: "SharedMountPoint", description: "SharedMountPoint"});
items.push({id: "clvm", description: "CLVM"});
args.response.success({data: items});
}
else if(selectedClusterObj.hypervisortype == "XenServer") {