diff --git a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java index c7f24619c91..659306ee303 100755 --- a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java +++ b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java @@ -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); diff --git a/agent/src/com/cloud/agent/storage/KVMStoragePoolManager.java b/agent/src/com/cloud/agent/storage/KVMStoragePoolManager.java index 337bd3aab96..d4cc0c25321 100644 --- a/agent/src/com/cloud/agent/storage/KVMStoragePoolManager.java +++ b/agent/src/com/cloud/agent/storage/KVMStoragePoolManager.java @@ -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, diff --git a/agent/src/com/cloud/agent/storage/LibvirtStorageAdaptor.java b/agent/src/com/cloud/agent/storage/LibvirtStorageAdaptor.java index f0115395308..bf0bcda05aa 100644 --- a/agent/src/com/cloud/agent/storage/LibvirtStorageAdaptor.java +++ b/agent/src/com/cloud/agent/storage/LibvirtStorageAdaptor.java @@ -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()); diff --git a/agent/src/com/cloud/agent/storage/LibvirtStoragePool.java b/agent/src/com/cloud/agent/storage/LibvirtStoragePool.java index 35b2989c959..1722732e153 100644 --- a/agent/src/com/cloud/agent/storage/LibvirtStoragePool.java +++ b/agent/src/com/cloud/agent/storage/LibvirtStoragePool.java @@ -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 diff --git a/api/src/com/cloud/storage/Storage.java b/api/src/com/cloud/storage/Storage.java index b683b9edfdf..428fc7d2f7a 100755 --- a/api/src/com/cloud/storage/Storage.java +++ b/api/src/com/cloud/storage/Storage.java @@ -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. diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index 4741d6a9b78..f055ef6f6e6 100644 --- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -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 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); diff --git a/scripts/storage/qcow2/managesnapshot.sh b/scripts/storage/qcow2/managesnapshot.sh index 57243e85f24..273b8dc9990 100755 --- a/scripts/storage/qcow2/managesnapshot.sh +++ b/scripts/storage/qcow2/managesnapshot.sh @@ -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 ] diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index 9cc1a8844d7..53fbaaf1481 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -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; diff --git a/server/src/com/cloud/configuration/Config.java b/server/src/com/cloud/configuration/Config.java index e87ef338ce7..5f2d5e4f312 100755 --- a/server/src/com/cloud/configuration/Config.java +++ b/server/src/com/cloud/configuration/Config.java @@ -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), diff --git a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java index 612d2b69797..088be6296ce 100755 --- a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java +++ b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java @@ -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()); } } } diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index df7e95b2008..777f17eef73 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -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; } diff --git a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java index 6accab99594..e6bb237bedf 100755 --- a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java +++ b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java @@ -362,7 +362,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V List allowedCidrs = new ArrayList(); 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()); } } } diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 5d8bcc84642..b35a94da26c 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -2549,11 +2549,15 @@ public class UserVmManagerImpl implements UserVmManager, UserVmService, Manager Pair 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()) { diff --git a/setup/db/db/schema-302to303.sql b/setup/db/db/schema-302to303.sql index 15f8fb89500..668d03e3fe7 100755 --- a/setup/db/db/schema-302to303.sql +++ b/setup/db/db/schema-302to303.sql @@ -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'; \ No newline at end of file +DELETE FROM `cloud`.`configuration` WHERE name='xen.min.xapi.version'; diff --git a/ui/css/cloudstack3.css b/ui/css/cloudstack3.css index b0d8f33fe73..b1b16d8afcc 100644 --- a/ui/css/cloudstack3.css +++ b/ui/css/cloudstack3.css @@ -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; diff --git a/ui/images/logo-cloudplatform.png b/ui/images/logo-cloudplatform.png new file mode 100644 index 00000000000..f749ec74d6a Binary files /dev/null and b/ui/images/logo-cloudplatform.png differ diff --git a/ui/images/logo-login.png b/ui/images/logo-login.png index e91be3b29ad..0c7e38e665e 100644 Binary files a/ui/images/logo-login.png and b/ui/images/logo-login.png differ diff --git a/ui/scripts/network.js b/ui/scripts/network.js index 95ed548a3ea..f855401c39f 100644 --- a/ui/scripts/network.js +++ b/ui/scripts/network.js @@ -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) diff --git a/ui/scripts/storage.js b/ui/scripts/storage.js index fbc96a3d8fa..7d357e20a5e 100644 --- a/ui/scripts/storage.js +++ b/ui/scripts/storage.js @@ -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) { diff --git a/ui/scripts/system.js b/ui/scripts/system.js index 8217bd923b9..6d0b14490d6 100644 --- a/ui/scripts/system.js +++ b/ui/scripts/system.js @@ -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") { diff --git a/ui/scripts/ui/core.js b/ui/scripts/ui/core.js index 3f658049e3f..5a1b2293612 100644 --- a/ui/scripts/ui/core.js +++ b/ui/scripts/ui/core.js @@ -315,7 +315,7 @@ } // Hide logo conditionally - if (!args.hasLogo) $('#header .controls').addClass('nologo'); + if (!args.hasLogo) $('#header, #header .controls').addClass('nologo'); return this; }; diff --git a/ui/scripts/zoneWizard.js b/ui/scripts/zoneWizard.js index 025542e0816..c616ffe33bb 100644 --- a/ui/scripts/zoneWizard.js +++ b/ui/scripts/zoneWizard.js @@ -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") {