Merge branch 'master' of ssh://git.cloud.com/var/lib/git/cloudstack-oss

This commit is contained in:
Kelven Yang 2010-08-26 13:56:23 -07:00
commit b69816814c
35 changed files with 825 additions and 368 deletions

View File

@ -1189,10 +1189,9 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
s_logger.debug(result);
return new CreateAnswer(cmd, result);
}
vol = createVolume(primaryPool, tmplVol);
LibvirtStorageVolumeDef volDef = new LibvirtStorageVolumeDef(UUID.randomUUID().toString(), tmplVol.getInfo().capacity, volFormat.QCOW2, tmplVol.getPath(), volFormat.QCOW2);
s_logger.debug(volDef.toString());
vol = primaryPool.storageVolCreateXML(volDef.toString(), 0);
if (vol == null) {
return new Answer(cmd, false, " Can't create storage volume on storage pool");
}
@ -1229,21 +1228,46 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
protected ManageSnapshotAnswer execute(final ManageSnapshotCommand cmd) {
String snapshotName = cmd.getSnapshotName();
String VolPath = cmd.getVolumePath();
String snapshotPath = cmd.getSnapshotPath();
String vmName = cmd.getVmName();
try {
StorageVol vol = getVolume(VolPath);
if (vol == null) {
return new ManageSnapshotAnswer(cmd, false, null);
DomainInfo.DomainState state = null;
Domain vm = null;
if (vmName != null) {
try {
vm = getDomain(cmd.getVmName());
state = vm.getInfo().state;
} catch (LibvirtException e) {
}
}
Domain vm = getDomain(cmd.getVmName());
String vmUuid = vm.getUUIDString();
Object[] args = new Object[] {snapshotName, vmUuid};
String snapshot = SnapshotXML.format(args);
s_logger.debug(snapshot);
if (cmd.getCommandSwitch().equalsIgnoreCase(ManageSnapshotCommand.CREATE_SNAPSHOT)) {
vm.snapshotCreateXML(snapshot);
if (state == DomainInfo.DomainState.VIR_DOMAIN_RUNNING) {
String vmUuid = vm.getUUIDString();
Object[] args = new Object[] {snapshotName, vmUuid};
String snapshot = SnapshotXML.format(args);
s_logger.debug(snapshot);
if (cmd.getCommandSwitch().equalsIgnoreCase(ManageSnapshotCommand.CREATE_SNAPSHOT)) {
vm.snapshotCreateXML(snapshot);
} else {
DomainSnapshot snap = vm.snapshotLookupByName(snapshotName);
snap.delete(0);
}
} else {
DomainSnapshot snap = vm.snapshotLookupByName(snapshotName);
snap.delete(0);
/*VM is not running, create a snapshot by ourself*/
final Script command = new Script(_manageSnapshotPath, _timeout, s_logger);
if (cmd.getCommandSwitch().equalsIgnoreCase(ManageSnapshotCommand.CREATE_SNAPSHOT)) {
command.add("-c", VolPath);
} else {
command.add("-d", snapshotPath);
}
command.add("-n", snapshotName);
String result = command.execute();
if (result != null) {
s_logger.debug("Failed to manage snapshot: " + result);
return new ManageSnapshotAnswer(cmd, false, "Failed to manage snapshot: " + result);
}
}
} catch (LibvirtException e) {
s_logger.debug("Failed to manage snapshot: " + e.toString());
@ -1260,28 +1284,52 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
String snapshotName = cmd.getSnapshotName();
String snapshotPath = cmd.getSnapshotUuid();
String snapshotDestPath = null;
String vmName = cmd.getVmName();
try {
StoragePool secondaryStoragePool = getNfsSPbyURI(_conn, new URI(secondaryStoragePoolURL));
String ssPmountPath = _mountPoint + File.separator + secondaryStoragePool.getUUIDString();
snapshotDestPath = ssPmountPath + File.separator + dcId + File.separator + "snapshots" + File.separator + accountId + File.separator + volumeId;
final Script command = new Script(_manageSnapshotPath, _timeout, s_logger);
Script command = new Script(_manageSnapshotPath, _timeout, s_logger);
command.add("-b", snapshotPath);
command.add("-n", snapshotName);
command.add("-p", snapshotDestPath);
command.add("-t", snapshotName);
String result = command.execute();
if (result != null) {
s_logger.debug("Failed to backup snaptshot: " + result);
return new BackupSnapshotAnswer(cmd, false, result, null);
}
/*Delete the snapshot on primary*/
Domain vm = getDomain(cmd.getVmName());
String vmUuid = vm.getUUIDString();
Object[] args = new Object[] {snapshotName, vmUuid};
String snapshot = SnapshotXML.format(args);
s_logger.debug(snapshot);
DomainSnapshot snap = vm.snapshotLookupByName(snapshotName);
snap.delete(0);
DomainInfo.DomainState state = null;
Domain vm = null;
if (vmName != null) {
try {
vm = getDomain(cmd.getVmName());
state = vm.getInfo().state;
} catch (LibvirtException e) {
}
}
if (state == DomainInfo.DomainState.VIR_DOMAIN_RUNNING) {
String vmUuid = vm.getUUIDString();
Object[] args = new Object[] {snapshotName, vmUuid};
String snapshot = SnapshotXML.format(args);
s_logger.debug(snapshot);
DomainSnapshot snap = vm.snapshotLookupByName(snapshotName);
snap.delete(0);
} else {
command = new Script(_manageSnapshotPath, _timeout, s_logger);
command.add("-d", snapshotPath);
command.add("-n", snapshotName);
result = command.execute();
if (result != null) {
s_logger.debug("Failed to backup snapshot: " + result);
return new BackupSnapshotAnswer(cmd, false, "Failed to backup snapshot: " + result, null);
}
}
} catch (LibvirtException e) {
return new BackupSnapshotAnswer(cmd, false, e.toString(), null);
} catch (URISyntaxException e) {
@ -1357,7 +1405,11 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
try {
secondaryPool = getNfsSPbyURI(_conn, new URI(cmd.getSecondaryStoragePoolURL()));
/*TODO: assuming all the storage pools mounted under _mountPoint, the mount point should be got from pool.dumpxml*/
String templatePath = _mountPoint + File.separator + secondaryPool.getUUIDString() + File.separator + templateInstallFolder;
String templatePath = _mountPoint + File.separator + secondaryPool.getUUIDString() + File.separator + templateInstallFolder;
File f = new File(templatePath);
if (!f.exists()) {
f.mkdir();
}
String tmplPath = templateInstallFolder + File.separator + tmplFileName;
Script command = new Script(_createTmplPath, _timeout, s_logger);
command.add("-t", templatePath);
@ -1404,38 +1456,58 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
}
protected CreatePrivateTemplateAnswer execute(CreatePrivateTemplateCommand cmd) {
String secondaryStorageURL = cmd.getSecondaryStorageURL();
String snapshotUUID = cmd.getSnapshotPath();
StoragePool secondaryStorage = null;
StoragePool privateTemplStorage = null;
StorageVol privateTemplateVol = null;
StorageVol snapshotVol = null;
try {
String templateFolder = cmd.getAccountId() + File.separator + cmd.getTemplateId() + File.separator;
String templateInstallFolder = "/template/tmpl/" + templateFolder;
secondaryStorage = getNfsSPbyURI(_conn, new URI(secondaryStorageURL));
/*TODO: assuming all the storage pools mounted under _mountPoint, the mount point should be got from pool.dumpxml*/
String mountPath = _mountPoint + File.separator + secondaryStorage.getUUIDString() + templateInstallFolder;
File mpfile = new File(mountPath);
String tmpltPath = _mountPoint + File.separator + secondaryStorage.getUUIDString() + templateInstallFolder;
File mpfile = new File(tmpltPath);
if (!mpfile.exists()) {
mpfile.mkdir();
}
Script command = new Script(_createTmplPath, _timeout, s_logger);
command.add("-f", cmd.getSnapshotPath());
command.add("-c", cmd.getSnapshotName());
command.add("-t", tmpltPath);
command.add("-n", cmd.getUniqueName() + ".qcow2");
command.add("-s");
String result = command.execute();
// Create a SR for the secondary storage installation folder
privateTemplStorage = getNfsSPbyURI(_conn, new URI(secondaryStorageURL + templateInstallFolder));
snapshotVol = getVolume(snapshotUUID);
LibvirtStorageVolumeDef vol = new LibvirtStorageVolumeDef(UUID.randomUUID().toString(), snapshotVol.getInfo().capacity, volFormat.QCOW2, null, null);
s_logger.debug(vol.toString());
privateTemplateVol = copyVolume(privateTemplStorage, vol, snapshotVol);
if (result != null) {
s_logger.debug("failed to create template: " + result);
return new CreatePrivateTemplateAnswer(cmd,
false,
result,
null,
0,
null,
null);
}
Map<String, Object> params = new HashMap<String, Object>();
params.put(StorageLayer.InstanceConfigKey, _storage);
Processor qcow2Processor = new QCOW2Processor();
qcow2Processor.configure("QCOW2 Processor", params);
FormatInfo info = qcow2Processor.process(tmpltPath, null, cmd.getUniqueName());
TemplateLocation loc = new TemplateLocation(_storage, tmpltPath);
loc.create(1, true, cmd.getUniqueName());
loc.addFormat(info);
loc.save();
return new CreatePrivateTemplateAnswer(cmd,
true,
null,
templateInstallFolder + privateTemplateVol.getName(),
privateTemplateVol.getInfo().capacity/1024*1024, /*in Mega unit*/
privateTemplateVol.getName(),
templateInstallFolder + cmd.getUniqueName() + ".qcow2",
info.virtualSize,
cmd.getUniqueName(),
ImageFormat.QCOW2);
} catch (URISyntaxException e) {
return new CreatePrivateTemplateAnswer(cmd,
@ -1454,7 +1526,31 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
0,
null,
null);
}
} catch (InternalErrorException e) {
return new CreatePrivateTemplateAnswer(cmd,
false,
e.toString(),
null,
0,
null,
null);
} catch (IOException e) {
return new CreatePrivateTemplateAnswer(cmd,
false,
e.toString(),
null,
0,
null,
null);
} catch (ConfigurationException e) {
return new CreatePrivateTemplateAnswer(cmd,
false,
e.toString(),
null,
0,
null,
null);
}
}
private StoragePool getNfsSPbyURI(Connect conn, URI uri) throws LibvirtException {
@ -2361,7 +2457,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
Iterator<Map.Entry<String, String>> itr = entrySet.iterator();
while (itr.hasNext()) {
Map.Entry<String, String> entry = itr.next();
if (entry.getValue().equalsIgnoreCase(sourceFile)) {
if ((entry.getValue() != null) && (entry.getValue().equalsIgnoreCase(sourceFile))) {
diskDev = entry.getKey();
break;
}
@ -2942,9 +3038,9 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
}
private String getHypervisorPath() {
File f =new File("/usr/bin/cloud-qemu-kvm");
File f =new File("/usr/bin/cloud-qemu-system-x86_64");
if (f.exists()) {
return "/usr/bin/cloud-qemu-kvm";
return "/usr/bin/cloud-qemu-system-x86_64";
} else {
if (_conn == null)
return null;
@ -3098,7 +3194,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
brName = setVnetBrName(vnetId);
String vnetDev = "vtap" + vnetId;
createVnet(vnetId, _pifs.first());
vnetNic.defBridgeNet(brName, vnetDev, guestMac, interfaceDef.nicModel.VIRTIO);
vnetNic.defBridgeNet(brName, null, guestMac, interfaceDef.nicModel.VIRTIO);
}
nics.add(vnetNic);
@ -3114,7 +3210,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
brName = setVnetBrName(vnetId);
String vnetDev = "vtap" + vnetId;
createVnet(vnetId, _pifs.second());
pubNic.defBridgeNet(brName, vnetDev, pubMac, interfaceDef.nicModel.VIRTIO);
pubNic.defBridgeNet(brName, null, pubMac, interfaceDef.nicModel.VIRTIO);
}
nics.add(pubNic);
return nics;
@ -3166,7 +3262,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
String datadiskPath = tmplVol.getKey();
diskDef hda = new diskDef();
hda.defFileBasedDisk(rootkPath, "vda", diskDef.diskBus.IDE, diskDef.diskFmtType.QCOW2);
hda.defFileBasedDisk(rootkPath, "hda", diskDef.diskBus.IDE, diskDef.diskFmtType.QCOW2);
disks.add(hda);
diskDef hdb = new diskDef();
@ -3502,6 +3598,22 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
}
}
private StorageVol createVolume(StoragePool destPool, StorageVol tmplVol) throws LibvirtException {
if (isCentosHost()) {
LibvirtStorageVolumeDef volDef = new LibvirtStorageVolumeDef(UUID.randomUUID().toString(), tmplVol.getInfo().capacity, volFormat.QCOW2, null, null);
s_logger.debug(volDef.toString());
StorageVol vol = destPool.storageVolCreateXML(volDef.toString(), 0);
/*create qcow2 image based on the name*/
Script.runSimpleBashScript("qemu-img create -f qcow2 -b " + tmplVol.getPath() + " " + vol.getPath() );
return vol;
} else {
LibvirtStorageVolumeDef volDef = new LibvirtStorageVolumeDef(UUID.randomUUID().toString(), tmplVol.getInfo().capacity, volFormat.QCOW2, tmplVol.getPath(), volFormat.QCOW2);
s_logger.debug(volDef.toString());
return destPool.storageVolCreateXML(volDef.toString(), 0);
}
}
private StorageVol getVolume(StoragePool pool, String volKey) {
StorageVol vol = null;
try {

View File

@ -94,6 +94,8 @@ public class LibvirtDomainXMLParser extends LibvirtXMLParser {
} else if (qName.equalsIgnoreCase("disk")) {
diskMaps.put(diskDev, diskFile);
_disk = false;
diskFile = null;
diskDev = null;
} else if (qName.equalsIgnoreCase("description")) {
_desc = false;
}

View File

@ -139,6 +139,7 @@ listSystemVms=com.cloud.api.commands.ListSystemVMsCmd;1
updateConfiguration=com.cloud.api.commands.UpdateCfgCmd;1
listConfigurations=com.cloud.api.commands.ListCfgsByCmd;1
addConfig=com.cloud.api.commands.AddConfigCmd;15
listCapabilities=com.cloud.api.commands.ListCapabilitiesCmd;15
#### pod commands
createPod=com.cloud.api.commands.CreatePodCmd;1
@ -207,4 +208,4 @@ listNetworkGroups=com.cloud.api.commands.ListNetworkGroupsCmd;11
registerPreallocatedLun=com.cloud.server.api.commands.RegisterPreallocatedLunCmd;1
deletePreallocatedLun=com.cloud.server.api.commands.DeletePreallocatedLunCmd;1
listPreallocatedLuns=com.cloud.api.commands.ListPreallocatedLunsCmd;1
listPreallocatedLuns=com.cloud.api.commands.ListPreallocatedLunsCmd;1

View File

@ -215,8 +215,9 @@
<dao name="IP Addresses configuration server" class="com.cloud.network.dao.IPAddressDaoImpl"/>
<dao name="Datacenter IP Addresses configuration server" class="com.cloud.dc.dao.DataCenterIpAddressDaoImpl"/>
<dao name="domain router" class="com.cloud.vm.dao.DomainRouterDaoImpl"/>
<dao name="host zone configuration server" class="com.cloud.dc.dao.DataCenterDaoImpl">
</dao>
<dao name="host zone configuration server" class="com.cloud.dc.dao.DataCenterDaoImpl"/>
<dao name="Console Proxy" class="com.cloud.vm.dao.ConsoleProxyDaoImpl"/>
<dao name="Secondary Storage VM" class="com.cloud.vm.dao.SecondaryStorageVmDaoImpl"/>
<dao name="host pod configuration server" class="com.cloud.dc.dao.HostPodDaoImpl">
</dao>
<dao name="PodVlanMap configuration server" class="com.cloud.dc.dao.PodVlanMapDaoImpl"/>

View File

@ -2187,4 +2187,5 @@ public interface ManagementServer {
boolean checkIfMaintenable(long hostId);
Map<String, String> listCapabilities();
}

View File

@ -80,4 +80,5 @@ public interface VMInstanceDao extends GenericDao<VMInstanceVO, Long> {
List<VMInstanceVO> listByHostIdTypes(long hostid, VirtualMachine.Type... types);
List<VMInstanceVO> listUpByHostIdTypes(long hostid, VirtualMachine.Type... types);
List<VMInstanceVO> listByZoneIdAndType(long zoneId, VirtualMachine.Type type);
}

View File

@ -51,6 +51,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase<VMInstanceVO, Long> implem
protected final SearchBuilder<VMInstanceVO> HostSearch;
protected final SearchBuilder<VMInstanceVO> LastHostSearch;
protected final SearchBuilder<VMInstanceVO> ZoneSearch;
protected final SearchBuilder<VMInstanceVO> ZoneVmTypeSearch;
protected final SearchBuilder<VMInstanceVO> ZoneTemplateNonExpungedSearch;
protected final SearchBuilder<VMInstanceVO> NameLikeSearch;
protected final SearchBuilder<VMInstanceVO> StateChangeSearch;
@ -79,6 +80,11 @@ public class VMInstanceDaoImpl extends GenericDaoBase<VMInstanceVO, Long> implem
ZoneSearch = createSearchBuilder();
ZoneSearch.and("zone", ZoneSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ);
ZoneSearch.done();
ZoneVmTypeSearch = createSearchBuilder();
ZoneVmTypeSearch.and("zone", ZoneVmTypeSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ);
ZoneVmTypeSearch.and("type", ZoneVmTypeSearch.entity().getType(), SearchCriteria.Op.EQ);
ZoneVmTypeSearch.done();
ZoneTemplateNonExpungedSearch = createSearchBuilder();
ZoneTemplateNonExpungedSearch.and("zone", ZoneTemplateNonExpungedSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ);
@ -193,6 +199,15 @@ public class VMInstanceDaoImpl extends GenericDaoBase<VMInstanceVO, Long> implem
return listActiveBy(sc);
}
@Override
public List<VMInstanceVO> listByZoneIdAndType(long zoneId, VirtualMachine.Type type) {
SearchCriteria<VMInstanceVO> sc = ZoneVmTypeSearch.create();
sc.setParameters("zone", zoneId);
sc.setParameters("type", type.toString());
return listActiveBy(sc);
}
@Override
public List<VMInstanceVO> listNonExpungedByZoneAndTemplate(long zoneId, long templateId) {
SearchCriteria<VMInstanceVO> sc = ZoneTemplateNonExpungedSearch.create();

View File

@ -0,0 +1,136 @@
#! /usr/bin/python
import web
import socket, struct
import cloud_utils
from cloud_utils import Command
urls = ("/ipallocator", "ipallocator")
app = web.application(urls, globals())
augtool = Command("augtool")
service = Command("service")
class dhcp:
_instance = None
def __init__(self):
self.availIP=[]
self.router=None
self.netmask=None
self.initialized=False
options = augtool.match("/files/etc/dnsmasq.conf/dhcp-option").stdout.strip()
for option in options.splitlines():
if option.find("option:router") != -1:
self.router = option.split("=")[1].strip().split(",")[1]
print self.router
dhcp_range = augtool.get("/files/etc/dnsmasq.conf/dhcp-range").stdout.strip()
dhcp_start = dhcp_range.split("=")[1].strip().split(",")[0]
dhcp_end = dhcp_range.split("=")[1].strip().split(",")[1]
self.netmask = dhcp_range.split("=")[1].strip().split(",")[2]
print dhcp_start, dhcp_end, self.netmask
start_ip_num = self.ipToNum(dhcp_start);
end_ip_num = self.ipToNum(dhcp_end)
print start_ip_num, end_ip_num
for ip in range(start_ip_num, end_ip_num + 1):
self.availIP.append(ip)
print self.availIP[0], self.availIP[len(self.availIP) - 1]
#load the ip already allocated
self.reloadAllocatedIP()
def ipToNum(self, ip):
return struct.unpack("!I", socket.inet_aton(ip))[0]
def numToIp(self, num):
return socket.inet_ntoa(struct.pack('!I', num))
def getFreeIP(self):
if len(self.availIP) > 0:
ip = self.numToIp(self.availIP[0])
self.availIP.remove(self.availIP[0])
return ip
else:
return None
def getNetmask(self):
return self.netmask
def getRouter(self):
return self.router
def getInstance():
if not dhcp._instance:
dhcp._instance = dhcp()
return dhcp._instance
getInstance = staticmethod(getInstance)
def reloadAllocatedIP(self):
dhcp_hosts = augtool.match("/files/etc/dnsmasq.conf/dhcp-host").stdout.strip().splitlines()
for host in dhcp_hosts:
if host.find("dhcp-host") != -1:
allocatedIP = self.ipToNum(host.split("=")[1].strip().split(",")[1])
if allocatedIP in self.availIP:
self.availIP.remove(allocatedIP)
def allocateIP(self, mac):
newIP = self.getFreeIP()
dhcp_host = augtool.match("/files/etc/dnsmasq.conf/dhcp-host").stdout.strip()
cnt = len(dhcp_host.splitlines()) + 1
script = """set %s %s
save"""%("/files/etc/dnsmasq.conf/dhcp-host[" + str(cnt) + "]", str(mac) + "," + newIP)
augtool < script
#reset dnsmasq
service("dnsmasq", "restart", stdout=None, stderr=None)
return newIP
def releaseIP(self, ip):
dhcp_host = augtool.match("/files/etc/dnsmasq.conf/dhcp-host").stdout.strip()
path = None
for host in dhcp_host.splitlines():
if host.find(ip) != -1:
path = host.split("=")[0].strip()
if path == None:
print "Can't find " + str(ip) + " in conf file"
return None
print path
script = """rm %s
save"""%(path)
augtool < script
#reset dnsmasq
service("dnsmasq", "restart", stdout=None, stderr=None)
class ipallocator:
def GET(self):
try:
user_data = web.input()
command = user_data.command
print "Processing: " + command
dhcpInit = dhcp.getInstance()
if command == "getIpAddr":
mac = user_data.mac
zone_id = user_data.dc
pod_id = user_data.pod
print mac, zone_id, pod_id
freeIP = dhcpInit.allocateIP(mac)
if not freeIP:
return "0,0,0"
print "Find an available IP: " + freeIP
return freeIP + "," + dhcpInit.getNetmask() + "," + dhcpInit.getRouter()
elif command == "releaseIpAddr":
ip = user_data.ip
zone_id = user_data.dc
pod_id = user_data.pod
dhcpInit.releaseIP(ip)
except:
return None
if __name__ == "__main__":
app.run()

View File

@ -80,6 +80,20 @@ create_from_file() {
fi
}
create_from_snapshot() {
local tmpltImg=$1
local snapshotName=$2
local tmpltfs=$3
local tmpltname=$4
cloud-qemu-img convert -f qcow2 -O qcow2 -s $snapshotName $tmpltImg /$tmpltfs/$tmpltname >& /dev/null
if [ $? -gt 0 ]
then
printf "Failed to create template /$tmplfs/$tmpltname from snapshot $snapshotName on disk $tmpltImg "
exit 2
fi
}
tflag=
nflag=
fflag=
@ -89,8 +103,9 @@ hvm=false
cleanup=false
dflag=
cflag=
snapshotName=
while getopts 'uht:n:f:s:c:d:' OPTION
while getopts 'uht:n:f:sc:d:' OPTION
do
case $OPTION in
t) tflag=1
@ -103,10 +118,10 @@ do
tmpltimg="$OPTARG"
;;
s) sflag=1
volsize="$OPTARG"
sflag=1
;;
c) cflag=1
cksum="$OPTARG"
snapshotName="$OPTARG"
;;
d) dflag=1
descr="$OPTARG"
@ -119,12 +134,6 @@ do
esac
done
if [ "$tflag$nflag$fflag" != "111" ]
then
usage
exit 2
fi
if [ ! -d /$tmpltfs ]
then
@ -148,7 +157,12 @@ then
printf "failed to uncompress $tmpltimg\n"
fi
create_from_file $tmpltfs $tmpltimg $tmpltname
if [ "$sflag" == "1" ]
then
create_from_snapshot $tmpltimg $snapshotName $tmpltfs $tmpltname
else
create_from_file $tmpltfs $tmpltimg $tmpltname
fi
touch /$tmpltfs/template.properties
echo -n "" > /$tmpltfs/template.properties

View File

@ -16,13 +16,20 @@ create_snapshot() {
local snapshotname=$2
local failed=0
qemu-img snapshot -c $snapshotname $disk
if [ ! -f $disk ]
then
failed=1
printf "No disk $disk exist\n" >&2
return $failed
fi
cloud-qemu-img snapshot -c $snapshotname $disk
if [ $? -gt 0 ]
then
failed=1
failed=2
printf "***Failed to create snapshot $snapshotname for path $disk\n" >&2
qemu-img snapshot -d $snapshotname $disk
cloud-qemu-img snapshot -d $snapshotname $disk
if [ $? -gt 0 ]
then
@ -34,21 +41,24 @@ create_snapshot() {
}
destroy_snapshot() {
local backupSnapDir=$1
local disk=$1
local snapshotname=$2
local failed=0
if [ -f $backupSnapDir/$snapshotname ]
if [ ! -f $disk ]
then
rm -f $backupSnapDir/$snapshotname
if [ $? -gt 0 ]
then
printf "***Failed to delete snapshot $snapshotname for path $backupSnapDir\n" >&2
failed=1
fi
failed=1
printf "No disk $disk exist\n" >&2
return $failed
fi
cloud-qemu-img snapshot -d $snapshotname $disk
if [ $? -gt 0 ]
then
failed=2
printf "Failed to delete snapshot $snapshotname for path $disk\n" >&2
fi
return $failed
}
@ -71,6 +81,7 @@ backup_snapshot() {
local disk=$1
local snapshotname=$2
local destPath=$3
local destName=$4
if [ ! -d $destPath ]
then
@ -90,7 +101,7 @@ backup_snapshot() {
return 1
fi
cloud-qemu-img convert -f qcow2 -O qcow2 -s $snapshotname $disk $destPath/$snapshotname >& /dev/null
cloud-qemu-img convert -f qcow2 -O qcow2 -s $snapshotname $disk $destPath/$destName >& /dev/null
if [ $? -gt 0 ]
then
printf "Failed to backup $snapshotname for disk $disk to $destPath" >&2
@ -107,8 +118,9 @@ bflag=
nflag=
pathval=
snapshot=
tmplName=
while getopts 'c:d:r:n:b:p:' OPTION
while getopts 'c:d:r:n:b:p:t:' OPTION
do
case $OPTION in
c) cflag=1
@ -128,6 +140,8 @@ do
;;
p) destPath="$OPTARG"
;;
t) tmplName="$OPTARG"
;;
?) usage
;;
esac
@ -144,7 +158,7 @@ then
exit $?
elif [ "$bflag" == "1" ]
then
backup_snapshot $pathval $snapshot $destPath
backup_snapshot $pathval $snapshot $destPath $tmplName
exit $?
elif [ "$rflag" == "1" ]
then

View File

@ -174,4 +174,4 @@ done
#install_cloud_agent $dflag
#install_cloud_consoleP $dflag
cloud_agent_setup $host $zone $pod $guid
cloud_consoleP_setup $host $zone $pod
#cloud_consoleP_setup $host $zone $pod

View File

@ -16,8 +16,8 @@
*
*/
package com.cloud.api.commands;
package com.cloud.api.commands;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@ -36,206 +36,204 @@ import com.cloud.user.UserStatisticsVO;
import com.cloud.uservm.UserVm;
import com.cloud.utils.Pair;
import com.cloud.vm.State;
public class ListAccountsCmd extends BaseCmd{
public static final Logger s_logger = Logger.getLogger(ListAccountsCmd.class.getName());
private static final String s_name = "listaccountsresponse";
private static final List<Pair<Enum, Boolean>> s_properties = new ArrayList<Pair<Enum, Boolean>>();
static {
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.ID, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.NAME, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.ACCOUNT_TYPE, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.STATE, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.IS_CLEANUP_REQUIRED, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.KEYWORD, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.ACCOUNT, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.PAGE, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.PAGESIZE, Boolean.FALSE));
}
public String getName() {
return s_name;
}
public List<Pair<Enum, Boolean>> getProperties() {
return s_properties;
}
@Override
public List<Pair<String, Object>> execute(Map<String, Object> params) {
Long id = (Long)params.get(BaseCmd.Properties.ID.getName());
Account account = (Account)params.get(BaseCmd.Properties.ACCOUNT_OBJ.getName());
Long domainId = (Long)params.get(BaseCmd.Properties.DOMAIN_ID.getName());
Long type = (Long)params.get(BaseCmd.Properties.ACCOUNT_TYPE.getName());
String state = (String)params.get(BaseCmd.Properties.STATE.getName());
Boolean needCleanup = (Boolean)params.get(BaseCmd.Properties.IS_CLEANUP_REQUIRED.getName());
Integer page = (Integer)params.get(BaseCmd.Properties.PAGE.getName());
Integer pageSize = (Integer)params.get(BaseCmd.Properties.PAGESIZE.getName());
String keyword = (String)params.get(BaseCmd.Properties.KEYWORD.getName());
boolean isAdmin = false;
Long accountId = null;
String accountName = null;
if ((account == null) || isAdmin(account.getType())) {
accountName = (String)params.get(BaseCmd.Properties.NAME.getName());
isAdmin = true;
if (domainId == null) {
// default domainId to the admin's domain
domainId = ((account == null) ? Domain.ROOT_DOMAIN : account.getDomainId());
} else if (account != null) {
if (!getManagementServer().isChildDomain(account.getDomainId(), domainId)) {
throw new ServerApiException(BaseCmd.PARAM_ERROR, "Invalid domain id (" + domainId + ") given, unable to list accounts");
}
}
} else {
accountName = (String)params.get(BaseCmd.Properties.ACCOUNT.getName());
accountId = account.getId();
}
Long startIndex = Long.valueOf(0);
int pageSizeNum = 50;
if (pageSize != null) {
pageSizeNum = pageSize.intValue();
}
if (page != null) {
int pageNum = page.intValue();
if (pageNum > 0) {
startIndex = Long.valueOf(pageSizeNum * (pageNum-1));
}
}
Criteria c = new Criteria("id", Boolean.TRUE, startIndex, Long.valueOf(pageSizeNum));
if (isAdmin == true) {
c.addCriteria(Criteria.ID, id);
if (keyword == null) {
c.addCriteria(Criteria.ACCOUNTNAME, accountName);
c.addCriteria(Criteria.DOMAINID, domainId);
c.addCriteria(Criteria.TYPE, type);
c.addCriteria(Criteria.STATE, state);
c.addCriteria(Criteria.ISCLEANUPREQUIRED, needCleanup);
} else {
c.addCriteria(Criteria.KEYWORD, keyword);
}
} else {
c.addCriteria(Criteria.ID, accountId);
}
List<AccountVO> accounts = getManagementServer().searchForAccounts(c);
List<Pair<String, Object>> accountTags = new ArrayList<Pair<String, Object>>();
Object[] aTag = new Object[accounts.size()];
int i = 0;
for (AccountVO accountO : accounts) {
boolean accountIsAdmin = (accountO.getType() == Account.ACCOUNT_TYPE_ADMIN);
if ((accountO.getRemoved() == null)&&(accountO.getId() != 1)) {
List<Pair<String, Object>> accountData = new ArrayList<Pair<String, Object>>();
accountData.add(new Pair<String, Object>(BaseCmd.Properties.ID.getName(), Long.valueOf(accountO.getId()).toString()));
accountData.add(new Pair<String, Object>(BaseCmd.Properties.NAME.getName(), accountO.getAccountName()));
accountData.add(new Pair<String, Object>(BaseCmd.Properties.ACCOUNT_TYPE.getName(), Short.valueOf(accountO.getType()).toString()));
Domain domain = getManagementServer().findDomainIdById(accountO.getDomainId());
accountData.add(new Pair<String, Object>(BaseCmd.Properties.DOMAIN_ID.getName(), Long.toString(domain.getId())));
accountData.add(new Pair<String, Object>(BaseCmd.Properties.DOMAIN.getName(), domain.getName()));
//get network stat
List<UserStatisticsVO> stats = getManagementServer().listUserStatsBy(accountO.getId());
if (stats == null) {
throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Internal error searching for user stats");
}
long bytesSent = 0;
long bytesReceived = 0;
for (UserStatisticsVO stat : stats) {
long rx = stat.getNetBytesReceived() + stat.getCurrentBytesReceived();
long tx = stat.getNetBytesSent() + stat.getCurrentBytesSent();
bytesReceived = bytesReceived + Long.valueOf(rx);
bytesSent = bytesSent + Long.valueOf(tx);
}
accountData.add(new Pair<String, Object>(BaseCmd.Properties.BYTES_RECEIVED.getName(), Long.valueOf(bytesReceived).toString()));
accountData.add(new Pair<String, Object>(BaseCmd.Properties.BYTES_SENT.getName(), Long.valueOf(bytesSent).toString()));
// Get resource limits and counts
long vmLimit = getManagementServer().findCorrectResourceLimit(ResourceType.user_vm, accountO.getId());
String vmLimitDisplay = (accountIsAdmin || vmLimit == -1) ? "Unlimited" : String.valueOf(vmLimit);
long vmTotal = getManagementServer().getResourceCount(ResourceType.user_vm, accountO.getId());
String vmAvail = (accountIsAdmin || vmLimit == -1) ? "Unlimited" : String.valueOf(vmLimit - vmTotal);
accountData.add(new Pair<String, Object>(BaseCmd.Properties.VM_LIMIT.getName(), vmLimitDisplay));
accountData.add(new Pair<String, Object>(BaseCmd.Properties.VM_TOTAL.getName(), vmTotal));
accountData.add(new Pair<String, Object>(BaseCmd.Properties.VM_AVAIL.getName(), vmAvail));
long ipLimit = getManagementServer().findCorrectResourceLimit(ResourceType.public_ip, accountO.getId());
String ipLimitDisplay = (accountIsAdmin || ipLimit == -1) ? "Unlimited" : String.valueOf(ipLimit);
long ipTotal = getManagementServer().getResourceCount(ResourceType.public_ip, accountO.getId());
String ipAvail = (accountIsAdmin || ipLimit == -1) ? "Unlimited" : String.valueOf(ipLimit - ipTotal);
accountData.add(new Pair<String, Object>(BaseCmd.Properties.IP_LIMIT.getName(), ipLimitDisplay));
accountData.add(new Pair<String, Object>(BaseCmd.Properties.IP_TOTAL.getName(), ipTotal));
accountData.add(new Pair<String, Object>(BaseCmd.Properties.IP_AVAIL.getName(), ipAvail));
long volumeLimit = getManagementServer().findCorrectResourceLimit(ResourceType.volume, accountO.getId());
String volumeLimitDisplay = (accountIsAdmin || volumeLimit == -1) ? "Unlimited" : String.valueOf(volumeLimit);
long volumeTotal = getManagementServer().getResourceCount(ResourceType.volume, accountO.getId());
String volumeAvail = (accountIsAdmin || volumeLimit == -1) ? "Unlimited" : String.valueOf(volumeLimit - volumeTotal);
accountData.add(new Pair<String, Object>(BaseCmd.Properties.VOLUME_LIMIT.getName(), volumeLimitDisplay));
accountData.add(new Pair<String, Object>(BaseCmd.Properties.VOLUME_TOTAL.getName(), volumeTotal));
accountData.add(new Pair<String, Object>(BaseCmd.Properties.VOLUME_AVAIL.getName(), volumeAvail));
long snapshotLimit = getManagementServer().findCorrectResourceLimit(ResourceType.snapshot, accountO.getId());
String snapshotLimitDisplay = (accountIsAdmin || snapshotLimit == -1) ? "Unlimited" : String.valueOf(snapshotLimit);
long snapshotTotal = getManagementServer().getResourceCount(ResourceType.snapshot, accountO.getId());
String snapshotAvail = (accountIsAdmin || snapshotLimit == -1) ? "Unlimited" : String.valueOf(snapshotLimit - snapshotTotal);
accountData.add(new Pair<String, Object>(BaseCmd.Properties.SNAPSHOT_LIMIT.getName(), snapshotLimitDisplay));
accountData.add(new Pair<String, Object>(BaseCmd.Properties.SNAPSHOT_TOTAL.getName(), snapshotTotal));
accountData.add(new Pair<String, Object>(BaseCmd.Properties.SNAPSHOT_AVAIL.getName(), snapshotAvail));
long templateLimit = getManagementServer().findCorrectResourceLimit(ResourceType.template, accountO.getId());
String templateLimitDisplay = (accountIsAdmin || templateLimit == -1) ? "Unlimited" : String.valueOf(templateLimit);
long templateTotal = getManagementServer().getResourceCount(ResourceType.template, accountO.getId());
String templateAvail = (accountIsAdmin || templateLimit == -1) ? "Unlimited" : String.valueOf(templateLimit - templateTotal);
accountData.add(new Pair<String, Object>(BaseCmd.Properties.TEMPLATE_LIMIT.getName(), templateLimitDisplay));
accountData.add(new Pair<String, Object>(BaseCmd.Properties.TEMPLATE_TOTAL.getName(), templateTotal));
accountData.add(new Pair<String, Object>(BaseCmd.Properties.TEMPLATE_AVAIL.getName(), templateAvail));
// Get stopped and running VMs
int vmStopped = 0;
int vmRunning = 0;
Long[] accountIds = new Long[1];
accountIds[0] = accountO.getId();
Criteria c1 = new Criteria();
c1.addCriteria(Criteria.ACCOUNTID, accountIds);
List<? extends UserVm> virtualMachines = getManagementServer().searchForUserVMs(c1);
//get Running/Stopped VMs
for (Iterator<? extends UserVm> iter = virtualMachines.iterator(); iter.hasNext();) {
// count how many stopped/running vms we have
UserVm vm = iter.next();
if (vm.getState() == State.Stopped) {
vmStopped++;
} else if (vm.getState() == State.Running) {
vmRunning++;
}
}
accountData.add(new Pair<String, Object>(BaseCmd.Properties.VM_STOPPED.getName(), vmStopped));
accountData.add(new Pair<String, Object>(BaseCmd.Properties.VM_RUNNING.getName(), vmRunning));
//show this info to admins only
if (isAdmin == true) {
accountData.add(new Pair<String, Object>(BaseCmd.Properties.STATE.getName(), accountO.getState()));
accountData.add(new Pair<String, Object>(BaseCmd.Properties.IS_CLEANUP_REQUIRED.getName(), Boolean.valueOf(accountO.getNeedsCleanup()).toString()));
}
aTag[i++] = accountData;
}
}
Pair<String, Object> accountTag = new Pair<String, Object>("account", aTag);
accountTags.add(accountTag);
return accountTags;
}
}
public class ListAccountsCmd extends BaseCmd{
public static final Logger s_logger = Logger.getLogger(ListAccountsCmd.class.getName());
private static final String s_name = "listaccountsresponse";
private static final List<Pair<Enum, Boolean>> s_properties = new ArrayList<Pair<Enum, Boolean>>();
static {
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.ID, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.NAME, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.ACCOUNT_TYPE, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.STATE, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.IS_CLEANUP_REQUIRED, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.KEYWORD, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.ACCOUNT, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.PAGE, Boolean.FALSE));
s_properties.add(new Pair<Enum, Boolean>(BaseCmd.Properties.PAGESIZE, Boolean.FALSE));
}
public String getName() {
return s_name;
}
public List<Pair<Enum, Boolean>> getProperties() {
return s_properties;
}
@Override
public List<Pair<String, Object>> execute(Map<String, Object> params) {
Long id = (Long)params.get(BaseCmd.Properties.ID.getName());
Account account = (Account)params.get(BaseCmd.Properties.ACCOUNT_OBJ.getName());
Long domainId = (Long)params.get(BaseCmd.Properties.DOMAIN_ID.getName());
Long type = (Long)params.get(BaseCmd.Properties.ACCOUNT_TYPE.getName());
String state = (String)params.get(BaseCmd.Properties.STATE.getName());
Boolean needCleanup = (Boolean)params.get(BaseCmd.Properties.IS_CLEANUP_REQUIRED.getName());
Integer page = (Integer)params.get(BaseCmd.Properties.PAGE.getName());
Integer pageSize = (Integer)params.get(BaseCmd.Properties.PAGESIZE.getName());
String keyword = (String)params.get(BaseCmd.Properties.KEYWORD.getName());
boolean isAdmin = false;
Long accountId = null;
String accountName = null;
if ((account == null) || isAdmin(account.getType())) {
accountName = (String)params.get(BaseCmd.Properties.NAME.getName());
isAdmin = true;
if (domainId == null) {
// default domainId to the admin's domain
domainId = ((account == null) ? Domain.ROOT_DOMAIN : account.getDomainId());
} else if (account != null) {
if (!getManagementServer().isChildDomain(account.getDomainId(), domainId)) {
throw new ServerApiException(BaseCmd.PARAM_ERROR, "Invalid domain id (" + domainId + ") given, unable to list accounts");
}
}
} else {
accountName = (String)params.get(BaseCmd.Properties.ACCOUNT.getName());
accountId = account.getId();
}
Long startIndex = Long.valueOf(0);
int pageSizeNum = 50;
if (pageSize != null) {
pageSizeNum = pageSize.intValue();
}
if (page != null) {
int pageNum = page.intValue();
if (pageNum > 0) {
startIndex = Long.valueOf(pageSizeNum * (pageNum-1));
}
}
Criteria c = new Criteria("id", Boolean.TRUE, startIndex, Long.valueOf(pageSizeNum));
if (isAdmin == true) {
c.addCriteria(Criteria.ID, id);
if (keyword == null) {
c.addCriteria(Criteria.ACCOUNTNAME, accountName);
c.addCriteria(Criteria.DOMAINID, domainId);
c.addCriteria(Criteria.TYPE, type);
c.addCriteria(Criteria.STATE, state);
c.addCriteria(Criteria.ISCLEANUPREQUIRED, needCleanup);
} else {
c.addCriteria(Criteria.KEYWORD, keyword);
}
} else {
c.addCriteria(Criteria.ID, accountId);
}
List<AccountVO> accounts = getManagementServer().searchForAccounts(c);
List<Pair<String, Object>> accountTags = new ArrayList<Pair<String, Object>>();
Object[] aTag = new Object[accounts.size()];
int i = 0;
for (AccountVO accountO : accounts) {
boolean accountIsAdmin = (accountO.getType() == Account.ACCOUNT_TYPE_ADMIN);
List<Pair<String, Object>> accountData = new ArrayList<Pair<String, Object>>();
accountData.add(new Pair<String, Object>(BaseCmd.Properties.ID.getName(), Long.valueOf(accountO.getId()).toString()));
accountData.add(new Pair<String, Object>(BaseCmd.Properties.NAME.getName(), accountO.getAccountName()));
accountData.add(new Pair<String, Object>(BaseCmd.Properties.ACCOUNT_TYPE.getName(), Short.valueOf(accountO.getType()).toString()));
Domain domain = getManagementServer().findDomainIdById(accountO.getDomainId());
accountData.add(new Pair<String, Object>(BaseCmd.Properties.DOMAIN_ID.getName(), Long.toString(domain.getId())));
accountData.add(new Pair<String, Object>(BaseCmd.Properties.DOMAIN.getName(), domain.getName()));
//get network stat
List<UserStatisticsVO> stats = getManagementServer().listUserStatsBy(accountO.getId());
if (stats == null) {
throw new ServerApiException(BaseCmd.INTERNAL_ERROR, "Internal error searching for user stats");
}
long bytesSent = 0;
long bytesReceived = 0;
for (UserStatisticsVO stat : stats) {
long rx = stat.getNetBytesReceived() + stat.getCurrentBytesReceived();
long tx = stat.getNetBytesSent() + stat.getCurrentBytesSent();
bytesReceived = bytesReceived + Long.valueOf(rx);
bytesSent = bytesSent + Long.valueOf(tx);
}
accountData.add(new Pair<String, Object>(BaseCmd.Properties.BYTES_RECEIVED.getName(), Long.valueOf(bytesReceived).toString()));
accountData.add(new Pair<String, Object>(BaseCmd.Properties.BYTES_SENT.getName(), Long.valueOf(bytesSent).toString()));
// Get resource limits and counts
long vmLimit = getManagementServer().findCorrectResourceLimit(ResourceType.user_vm, accountO.getId());
String vmLimitDisplay = (accountIsAdmin || vmLimit == -1) ? "Unlimited" : String.valueOf(vmLimit);
long vmTotal = getManagementServer().getResourceCount(ResourceType.user_vm, accountO.getId());
String vmAvail = (accountIsAdmin || vmLimit == -1) ? "Unlimited" : String.valueOf(vmLimit - vmTotal);
accountData.add(new Pair<String, Object>(BaseCmd.Properties.VM_LIMIT.getName(), vmLimitDisplay));
accountData.add(new Pair<String, Object>(BaseCmd.Properties.VM_TOTAL.getName(), vmTotal));
accountData.add(new Pair<String, Object>(BaseCmd.Properties.VM_AVAIL.getName(), vmAvail));
long ipLimit = getManagementServer().findCorrectResourceLimit(ResourceType.public_ip, accountO.getId());
String ipLimitDisplay = (accountIsAdmin || ipLimit == -1) ? "Unlimited" : String.valueOf(ipLimit);
long ipTotal = getManagementServer().getResourceCount(ResourceType.public_ip, accountO.getId());
String ipAvail = (accountIsAdmin || ipLimit == -1) ? "Unlimited" : String.valueOf(ipLimit - ipTotal);
accountData.add(new Pair<String, Object>(BaseCmd.Properties.IP_LIMIT.getName(), ipLimitDisplay));
accountData.add(new Pair<String, Object>(BaseCmd.Properties.IP_TOTAL.getName(), ipTotal));
accountData.add(new Pair<String, Object>(BaseCmd.Properties.IP_AVAIL.getName(), ipAvail));
long volumeLimit = getManagementServer().findCorrectResourceLimit(ResourceType.volume, accountO.getId());
String volumeLimitDisplay = (accountIsAdmin || volumeLimit == -1) ? "Unlimited" : String.valueOf(volumeLimit);
long volumeTotal = getManagementServer().getResourceCount(ResourceType.volume, accountO.getId());
String volumeAvail = (accountIsAdmin || volumeLimit == -1) ? "Unlimited" : String.valueOf(volumeLimit - volumeTotal);
accountData.add(new Pair<String, Object>(BaseCmd.Properties.VOLUME_LIMIT.getName(), volumeLimitDisplay));
accountData.add(new Pair<String, Object>(BaseCmd.Properties.VOLUME_TOTAL.getName(), volumeTotal));
accountData.add(new Pair<String, Object>(BaseCmd.Properties.VOLUME_AVAIL.getName(), volumeAvail));
long snapshotLimit = getManagementServer().findCorrectResourceLimit(ResourceType.snapshot, accountO.getId());
String snapshotLimitDisplay = (accountIsAdmin || snapshotLimit == -1) ? "Unlimited" : String.valueOf(snapshotLimit);
long snapshotTotal = getManagementServer().getResourceCount(ResourceType.snapshot, accountO.getId());
String snapshotAvail = (accountIsAdmin || snapshotLimit == -1) ? "Unlimited" : String.valueOf(snapshotLimit - snapshotTotal);
accountData.add(new Pair<String, Object>(BaseCmd.Properties.SNAPSHOT_LIMIT.getName(), snapshotLimitDisplay));
accountData.add(new Pair<String, Object>(BaseCmd.Properties.SNAPSHOT_TOTAL.getName(), snapshotTotal));
accountData.add(new Pair<String, Object>(BaseCmd.Properties.SNAPSHOT_AVAIL.getName(), snapshotAvail));
long templateLimit = getManagementServer().findCorrectResourceLimit(ResourceType.template, accountO.getId());
String templateLimitDisplay = (accountIsAdmin || templateLimit == -1) ? "Unlimited" : String.valueOf(templateLimit);
long templateTotal = getManagementServer().getResourceCount(ResourceType.template, accountO.getId());
String templateAvail = (accountIsAdmin || templateLimit == -1) ? "Unlimited" : String.valueOf(templateLimit - templateTotal);
accountData.add(new Pair<String, Object>(BaseCmd.Properties.TEMPLATE_LIMIT.getName(), templateLimitDisplay));
accountData.add(new Pair<String, Object>(BaseCmd.Properties.TEMPLATE_TOTAL.getName(), templateTotal));
accountData.add(new Pair<String, Object>(BaseCmd.Properties.TEMPLATE_AVAIL.getName(), templateAvail));
// Get stopped and running VMs
int vmStopped = 0;
int vmRunning = 0;
Long[] accountIds = new Long[1];
accountIds[0] = accountO.getId();
Criteria c1 = new Criteria();
c1.addCriteria(Criteria.ACCOUNTID, accountIds);
List<? extends UserVm> virtualMachines = getManagementServer().searchForUserVMs(c1);
//get Running/Stopped VMs
for (Iterator<? extends UserVm> iter = virtualMachines.iterator(); iter.hasNext();) {
// count how many stopped/running vms we have
UserVm vm = iter.next();
if (vm.getState() == State.Stopped) {
vmStopped++;
} else if (vm.getState() == State.Running) {
vmRunning++;
}
}
accountData.add(new Pair<String, Object>(BaseCmd.Properties.VM_STOPPED.getName(), vmStopped));
accountData.add(new Pair<String, Object>(BaseCmd.Properties.VM_RUNNING.getName(), vmRunning));
//show this info to admins only
if (isAdmin == true) {
accountData.add(new Pair<String, Object>(BaseCmd.Properties.STATE.getName(), accountO.getState()));
accountData.add(new Pair<String, Object>(BaseCmd.Properties.IS_CLEANUP_REQUIRED.getName(), Boolean.valueOf(accountO.getNeedsCleanup()).toString()));
}
aTag[i++] = accountData;
}
Pair<String, Object> accountTag = new Pair<String, Object>("account", aTag);
accountTags.add(accountTag);
return accountTags;
}
}

View File

@ -0,0 +1,58 @@
/**
* Copyright (C) 2010 Cloud.com, Inc. All rights reserved.
*
* This software is licensed under the GNU General Public License v3 or later.
*
* It is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package com.cloud.api.commands;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import com.cloud.api.BaseCmd;
import com.cloud.utils.Pair;
public class ListCapabilitiesCmd extends BaseCmd {
public static final Logger s_logger = Logger.getLogger(ListCapabilitiesCmd.class.getName());
private static final String s_name = "listcapabilitiesresponse";
private static final List<Pair<Enum, Boolean>> s_properties = new ArrayList<Pair<Enum, Boolean>>();
public String getName() {
return s_name;
}
public List<Pair<Enum, Boolean>> getProperties() {
return s_properties;
}
@Override
public List<Pair<String, Object>> execute(Map<String, Object> params) {
Map<String, String> capabilities = null;
capabilities = getManagementServer().listCapabilities();
Iterator<String> iterator = capabilities.keySet().iterator();
List<Pair<String, Object>> capabilityPair = new ArrayList<Pair<String, Object>>();
while (iterator.hasNext()) {
String capability = iterator.next();
capabilityPair.add(new Pair<String, Object>(capability, capabilities.get(capability)));
}
return capabilityPair;
}
}

View File

@ -146,6 +146,7 @@ public enum Config {
DirectAttachNetworkExternalAPIURL("Advanced", ManagementServer.class, String.class, "direct.attach.network.externalIpAllocator.url", null, "Direct-attach VMs using external DHCP server (API url)", null),
DirectAttachUntaggedVlanEnabled("Advanced", ManagementServer.class, String.class, "direct.attach.untagged.vlan.enabled", "false", "Indicate whether the system supports direct-attached untagged vlan", "true,false"),
CheckPodCIDRs("Advanced", ManagementServer.class, String.class, "check.pod.cidrs", "true", "If true, different pods must belong to different CIDR subnets.", "true,false"),
MD5Hashed("Advanced", ManagementServer.class, Boolean.class, "security.password.md5hashed", "true", "If set to false password is sent in clear text or else md5hashed", null),
// XenServer
VmAllocationAlgorithm("Advanced", ManagementServer.class, String.class, "vm.allocation.algorithm", "random", "If 'random', hosts within a pod will be randomly considered for VM/volume allocation. If 'firstfit', they will be considered on a first-fit basis.", null),

View File

@ -57,6 +57,7 @@ import com.cloud.offering.NetworkOffering.GuestIpType;
import com.cloud.service.ServiceOfferingVO;
import com.cloud.service.dao.ServiceOfferingDao;
import com.cloud.storage.DiskOfferingVO;
import com.cloud.storage.SecondaryStorage;
import com.cloud.storage.dao.DiskOfferingDao;
import com.cloud.user.AccountVO;
import com.cloud.user.UserVO;
@ -66,9 +67,14 @@ import com.cloud.utils.component.Inject;
import com.cloud.utils.db.DB;
import com.cloud.utils.db.Transaction;
import com.cloud.utils.net.NetUtils;
import com.cloud.vm.ConsoleProxyVO;
import com.cloud.vm.DomainRouterVO;
import com.cloud.vm.SecondaryStorageVmVO;
import com.cloud.vm.VMInstanceVO;
import com.cloud.vm.VirtualMachine;
import com.cloud.vm.dao.ConsoleProxyDao;
import com.cloud.vm.dao.DomainRouterDao;
import com.cloud.vm.dao.SecondaryStorageVmDao;
import com.cloud.vm.dao.VMInstanceDao;
@Local(value={ConfigurationManager.class})
@ -91,6 +97,8 @@ public class ConfigurationManagerImpl implements ConfigurationManager {
@Inject AccountDao _accountDao;
@Inject EventDao _eventDao;
@Inject UserDao _userDao;
@Inject ConsoleProxyDao _consoleDao;
@Inject SecondaryStorageVmDao _secStorageDao;
public boolean _premium;
@Override
@ -665,13 +673,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager {
throw new InvalidParameterValueException("A zone with ID: " + zoneId + " does not exist.");
}
// If DNS values are being changed, make sure there are no VMs in this zone
if (dns1 != null || dns2 != null || internalDns1 != null || internalDns2 != null) {
if (zoneHasVMs(zoneId)) {
throw new InternalErrorException("The zone is not editable because there are VMs in the zone.");
}
}
// If the Vnet range is being changed, make sure there are no allocated VNets
if (vnetRange != null) {
if (zoneHasAllocatedVnets(zoneId)) {
@ -679,22 +680,6 @@ public class ConfigurationManagerImpl implements ConfigurationManager {
}
}
//To modify a zone, we need to make sure there are no domr's associated with it
//1. List all the domain router objs
//2. Check if any of these has the current data center associated
//3. If yes, throw exception
//4, If no, edit
List<DomainRouterVO> allDomainRoutersAvailable = _domrDao.listAll();
for(DomainRouterVO domR : allDomainRoutersAvailable)
{
if(domR.getDataCenterId() == zoneId)
{
throw new InternalErrorException("The zone is not editable because there are domR's associated with the zone.");
}
}
//5. Reached here, hence editable
DataCenterVO zone = _zoneDao.findById(zoneId);
String oldZoneName = zone.getName();
@ -703,6 +688,12 @@ public class ConfigurationManagerImpl implements ConfigurationManager {
newZoneName = oldZoneName;
}
boolean dnsUpdate = false;
if(dns1 != null || dns2 != null){
dnsUpdate = true;
}
if (dns1 == null) {
dns1 = zone.getDns1();
}
@ -742,6 +733,48 @@ public class ConfigurationManagerImpl implements ConfigurationManager {
_zoneDao.addVnet(zone.getId(), begin, end);
}
if(dnsUpdate){
//Update dns for domRs in zone
List<DomainRouterVO> DomainRouters = _domrDao.listByDataCenter(zoneId);
for(DomainRouterVO domR : DomainRouters)
{
domR.setDns1(dns1);
domR.setDns2(dns2);
_domrDao.update(domR.getId(), domR);
}
//Update dns for console proxies in zone
List<VMInstanceVO> ConsoleProxies = _vmInstanceDao.listByZoneIdAndType(zoneId, VirtualMachine.Type.ConsoleProxy);
for(VMInstanceVO consoleVm : ConsoleProxies)
{
ConsoleProxyVO proxy = _consoleDao.findById(consoleVm.getId());
if( proxy!= null ){
proxy.setDns1(dns1);
proxy.setDns2(dns2);
_consoleDao.update(proxy.getId(), proxy);
}
}
//Update dns for secondary storage Vms in zone
List<VMInstanceVO> storageVms = _vmInstanceDao.listByZoneIdAndType(zoneId, VirtualMachine.Type.SecondaryStorageVm);
for(VMInstanceVO storageVm : storageVms)
{
SecondaryStorageVmVO secStorageVm = _secStorageDao.findById(storageVm.getId());
if( secStorageVm!= null ){
secStorageVm.setDns1(dns1);
secStorageVm.setDns2(dns2);
_secStorageDao.update(secStorageVm.getId(), secStorageVm);
}
}
}
saveConfigurationEvent(userId, null, EventTypes.EVENT_ZONE_EDIT, "Successfully edited zone with name: " + zone.getName() + ".", "dcId=" + zone.getId(), "dns1=" + dns1, "dns2=" + dns2, "internalDns1=" + internalDns1, "internalDns2=" + internalDns2, "vnetRange=" + vnetRange, "guestCidr=" + guestCidr);
return zone;

View File

@ -4402,6 +4402,7 @@ public class ManagementServerImpl implements ManagementServer {
SearchBuilder<AccountVO> sb = _accountDao.createSearchBuilder();
sb.and("accountName", sb.entity().getAccountName(), SearchCriteria.Op.LIKE);
sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ);
sb.and("nid", sb.entity().getId(), SearchCriteria.Op.NEQ);
sb.and("type", sb.entity().getType(), SearchCriteria.Op.EQ);
sb.and("state", sb.entity().getState(), SearchCriteria.Op.EQ);
sb.and("needsCleanup", sb.entity().getNeedsCleanup(), SearchCriteria.Op.EQ);
@ -4433,6 +4434,9 @@ public class ManagementServerImpl implements ManagementServer {
// I want to join on user_vm.domain_id = domain.id where domain.path like 'foo%'
sc.setJoinParameters("domainSearch", "path", domain.getPath() + "%");
sc.setParameters("nid", 1L);
} else {
sc.setParameters("nid", 1L);
}
if (type != null) {
@ -8590,6 +8594,26 @@ public class ManagementServerImpl implements ManagementServer {
return false;
}
@Override
public Map<String, String> listCapabilities() {
Map<String, String> capabilities = new HashMap<String, String>();
String networkGroupsEnabled = _configs.get("direct.attach.network.groups.enabled");
if(networkGroupsEnabled == null)
networkGroupsEnabled = "false";
capabilities.put("networkGroupsEnabled", networkGroupsEnabled);
final Class<?> c = this.getClass();
String fullVersion = c.getPackage().getImplementationVersion();
String version = "unknown";
if(fullVersion.length() > 0){
version = fullVersion.substring(0,fullVersion.lastIndexOf("."));
}
capabilities.put("cloudStackVersion", version);
return capabilities;
}
}

View File

@ -939,10 +939,12 @@ public class StorageManagerImpl implements StorageManager {
if (vmId != null) {
VMInstanceVO vmInstance = _vmInstanceDao.findById(vmId);
if (vmInstance != null) {
return vmInstance.getHostId();
Long hostId = vmInstance.getHostId();
if (hostId != null && !avoidHosts.contains(vmInstance.getHostId()))
return hostId;
}
}
return null;
/*Can't find the vm where host resides on(vm is destroyed? or volume is detached from vm), randomly choose a host to send the cmd */
}
List<StoragePoolHostVO> poolHosts = _poolHostDao.listByHostStatus(poolVO.getId(), Status.Up);
Collections.shuffle(poolHosts);

View File

@ -287,7 +287,7 @@ public class SnapshotManagerImpl implements SnapshotManager {
}
txn.commit();
VolumeVO volume = _volsDao.findById(volumeId);
VolumeVO volume = _volsDao.lock(volumeId, true);
if (!shouldRunSnapshot(userId, volume, policyIds)) {
// A null snapshot is interpreted as snapshot creation failed which is what we want to indicate
@ -477,7 +477,7 @@ public class SnapshotManagerImpl implements SnapshotManager {
_snapshotDao.update(snapshot.getId(), snapshot);
long volumeId = snapshot.getVolumeId();
VolumeVO volume = _volsDao.findById(volumeId);
VolumeVO volume = _volsDao.lock(volumeId, true);
String primaryStoragePoolNameLabel = _storageMgr.getPrimaryStorageNameLabel(volume);
Long dcId = volume.getDataCenterId();

View File

@ -686,6 +686,7 @@ public class UserVmManagerImpl implements UserVmManager {
}
boolean started = false;
Transaction txn = Transaction.currentTxn();
try {
@ -736,6 +737,11 @@ public class UserVmManagerImpl implements UserVmManager {
VolumeVO vol = rootVols.get(0);
List<VolumeVO> vols = _volsDao.findCreatedByInstance(vm.getId());
List<VolumeVO> vos = new ArrayList<VolumeVO>();
/*compete with take snapshot*/
for (VolumeVO userVmVol : vols) {
vos.add(_volsDao.lock(userVmVol.getId(), true));
}
Answer answer = null;
int retry = _retry;
@ -2215,7 +2221,7 @@ public class UserVmManagerImpl implements UserVmManager {
@Override @DB
public SnapshotVO createTemplateSnapshot(long userId, long volumeId) {
SnapshotVO createdSnapshot = null;
VolumeVO volume = _volsDao.findById(volumeId);
VolumeVO volume = _volsDao.lock(volumeId, true);
Long id = null;

17
ui/index.html → ui/index.jsp Normal file → Executable file
View File

@ -1,3 +1,9 @@
<%@ page import="java.util.Date" %>
<%
long milliseconds = new Date().getTime();
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
@ -5,11 +11,10 @@
<meta http-equiv='cache-control' content='no-cache'>
<meta http-equiv='expires' content='0'>
<meta http-equiv='pragma' content='no-cache'>
<meta name="version" content="@VERSION@" />
<meta name="version" content="1.9.1.13" />
<title>cloud.com - User Console</title>
<!-- Style Sheet -->
<link rel= "stylesheet" href="css/main.css" type="text/css" />
<link rel= "stylesheet" href="css/jquery-ui-1.8.2.custom.css" type="text/css" />
@ -38,12 +43,12 @@
<script type="text/javascript" src="scripts/jquery.md5.js"></script>
<!-- Callback script for Single Signon -->
<script type="text/javascript" src="scripts/cloud.core.callbacks.js"></script>
<script type="text/javascript" src="scripts/cloud.core.callbacks.js?t=<%=milliseconds%>"></script>
<!-- cloud.com scripts -->
<script type="text/javascript" src="scripts/cloud.logger.js"></script>
<script type="text/javascript" src="scripts/cloud.core.js"></script>
<script type="text/javascript" src="scripts/cloud.core.init.js"></script>
<script type="text/javascript" src="scripts/cloud.logger.js?t=<%=milliseconds%>"></script>
<script type="text/javascript" src="scripts/cloud.core.js?t=<%=milliseconds%>"></script>
<script type="text/javascript" src="scripts/cloud.core.init.js?t=<%=milliseconds%>"></script>
<!-- Favicon -->
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon" />

View File

@ -1,4 +1,8 @@
<script type="text/javascript" src="scripts/cloud.core.accounts.js"></script>
<%@ page import="java.util.Date" %>
<%
long milliseconds = new Date().getTime();
%>
<script type="text/javascript" src="scripts/cloud.core.accounts.js?t=<%=milliseconds%>"></script>
<!-- Accounts -->
<div class="maincontent" style="display:block;" id="submenu_content_account">

View File

@ -1,4 +1,8 @@
<script type="text/javascript" src="scripts/cloud.core.configuration.js"></script>
<%@ page import="java.util.Date" %>
<%
long milliseconds = new Date().getTime();
%>
<script type="text/javascript" src="scripts/cloud.core.configuration.js?t=<%=milliseconds%>"></script>
<!-- Content Panel -->
<!-- Submenu -->

View File

7
ui/jsp/tab_domains.jsp Normal file → Executable file
View File

@ -1,5 +1,8 @@
<script type="text/javascript" src="scripts/cloud.core.domains.js"></script>
<%@ page import="java.util.Date" %>
<%
long milliseconds = new Date().getTime();
%>
<script type="text/javascript" src="scripts/cloud.core.domains.js?t=<%=milliseconds%>"></script>
<!-- Content Panel -->
<div class="maincontent" style="display:block;" id="submenu_content_domains">

6
ui/content/tab_events.html → ui/jsp/tab_events.jsp Normal file → Executable file
View File

@ -1,4 +1,8 @@
<script type="text/javascript" src="scripts/cloud.core.events.js"></script>
<%@ page import="java.util.Date" %>
<%
long milliseconds = new Date().getTime();
%>
<script type="text/javascript" src="scripts/cloud.core.events.js?t=<%=milliseconds%>"></script>
<!-- Content Panel -->
<!-- Submenus -->

6
ui/content/tab_hosts.html → ui/jsp/tab_hosts.jsp Normal file → Executable file
View File

@ -1,4 +1,8 @@
<script type="text/javascript" src="scripts/cloud.core.hosts.js"></script>
<%@ page import="java.util.Date" %>
<%
long milliseconds = new Date().getTime();
%>
<script type="text/javascript" src="scripts/cloud.core.hosts.js?t=<%=milliseconds%>"></script>
<div class="maincontent" id="submenu_content_routing" style="display:block">
<div id="maincontent_title">

View File

@ -1,4 +1,8 @@
<script type="text/javascript" src="scripts/cloud.core.instances.js"></script>
<%@ page import="java.util.Date" %>
<%
long milliseconds = new Date().getTime();
%>
<script type="text/javascript" src="scripts/cloud.core.instances.js?t=<%=milliseconds%>"></script>
<!-- Content Panel -->
<!-- Submenu -->
@ -704,8 +708,7 @@
<h2>
<strong>Step 3:</strong> Optional</h2>
<p>
To create a new instance, please first select a zone you wish to have your virtual
instance hosted on.</p>
You can choose to name and group your virtual machine for easy identification. You can also choose additional data storage. (These options can be added at any time.) </p>
</div>
<div class="rev_wizmid_contentbox">
<div class="rev_tempsearchpanel">

View File

@ -1,4 +1,8 @@
<script type="text/javascript" src="scripts/cloud.core.network.js"></script>
<%@ page import="java.util.Date" %>
<%
long milliseconds = new Date().getTime();
%>
<script type="text/javascript" src="scripts/cloud.core.network.js?t=<%=milliseconds%>"></script>
<!-- Content Panel -->
<!-- Submenus -->
<div class="submenu_links">

6
ui/content/tab_storage.html → ui/jsp/tab_storage.jsp Normal file → Executable file
View File

@ -1,4 +1,8 @@
<script type="text/javascript" src="scripts/cloud.core.storage.js"></script>
<%@ page import="java.util.Date" %>
<%
long milliseconds = new Date().getTime();
%>
<script type="text/javascript" src="scripts/cloud.core.storage.js?t=<%=milliseconds%>"></script>
<div class="submenu_links">
<div class="submenu_links_on" id="submenu_pool">

View File

@ -1,4 +1,8 @@
<script type="text/javascript" src="scripts/cloud.core.templates.js"></script>
<%@ page import="java.util.Date" %>
<%
long milliseconds = new Date().getTime();
%>
<script type="text/javascript" src="scripts/cloud.core.templates.js?t=<%=milliseconds%>"></script>
<div class="submenu_links">
<div class="submenu_links_on" id="submenu_template">Template</div>

View File

@ -1244,7 +1244,7 @@ function showConfigurationTab() {
dialogEditService.find("#service_name").text(svcName);
dialogEditService.find("#edit_service_name").val(svcName);
dialogEditService.find("#edit_service_display").val(template.find("#service_display").text());
dialogEditService.find("#edit_service_display").val(template.find("#service_displaytext").text());
dialogEditService.find("#edit_service_offerha").val(toBooleanValue(template.find("#service_offerha").text()));
dialogEditService
@ -1260,9 +1260,9 @@ function showConfigurationTab() {
var moreCriteria = [];
var name = trim(thisDialog.find("#edit_service_name").val());
moreCriteria.push("&name="+encodeURIComponent(name));
moreCriteria.push("&name="+encodeURIComponent(escape(name)));
var displaytext = trim(thisDialog.find("#edit_service_display").val());
moreCriteria.push("&displayText="+encodeURIComponent(displaytext));
moreCriteria.push("&displayText="+encodeURIComponent(escape(displaytext)));
var offerha = trim(thisDialog.find("#edit_service_offerha").val());
moreCriteria.push("&offerha="+offerha);
@ -1316,17 +1316,17 @@ function showConfigurationTab() {
function serviceJSONToTemplate(json, template) {
template.attr("id", "service_"+json.id);
(index++ % 2 == 0)? template.addClass("smallrow_even"): template.addClass("smallrow_odd");
template.data("svcId", json.id).data("svcName", sanitizeXSS(json.name));
template.data("svcId", json.id).data("svcName", sanitizeXSS(unescape(json.name)));
template.find("#service_id").text(json.id);
template.find("#service_name").text(json.name);
template.find("#service_displaytext").text(json.displaytext);
template.find("#service_name").text(unescape(json.name));
template.find("#service_displaytext").text(unescape(json.displaytext));
template.find("#service_storagetype").text(json.storagetype);
template.find("#service_cpu").text(json.cpunumber + " x " + convertHz(json.cpuspeed));
template.find("#service_memory").text(convertBytes(parseInt(json.memory)*1024*1024));
template.find("#service_offerha").text(toBooleanText(json.offerha));
template.find("#service_networktype").text(toNetworkType(json.usevirtualnetwork));
template.find("#service_tags").text(json.tags);
template.find("#service_tags").text(unescape(json.tags));
setDateField(json.created, template.find("#service_created"));
}
@ -1454,10 +1454,10 @@ function showConfigurationTab() {
var array1 = [];
var name = trim(thisDialog.find("#add_service_name").val());
array1.push("&name="+encodeURIComponent(name));
array1.push("&name="+encodeURIComponent(escape(name)));
var display = trim(thisDialog.find("#add_service_display").val());
array1.push("&displayText="+encodeURIComponent(display));
array1.push("&displayText="+encodeURIComponent(escape(display)));
var storagetype = trim(thisDialog.find("#add_service_storagetype").val());
array1.push("&storageType="+storagetype);
@ -1480,7 +1480,7 @@ function showConfigurationTab() {
var tags = trim(thisDialog.find("#add_service_tags").val());
if(tags != null && tags.length > 0)
array1.push("&tags="+encodeURIComponent(tags));
array1.push("&tags="+encodeURIComponent(escape(tags)));
thisDialog.dialog("close");
$.ajax({
@ -1544,17 +1544,17 @@ function showConfigurationTab() {
var array1 = [];
var name = trim(thisDialog.find("#add_disk_name").val());
array1.push("&name="+encodeURIComponent(name));
array1.push("&name="+encodeURIComponent(escape(name)));
var description = trim(thisDialog.find("#add_disk_description").val());
array1.push("&displaytext="+encodeURIComponent(description));
array1.push("&displaytext="+encodeURIComponent(escape(description)));
var disksize = trim(thisDialog.find("#add_disk_disksize").val());
array1.push("&disksize="+disksize);
var tags = trim(thisDialog.find("#add_disk_tags").val());
if(tags != null && tags.length > 0)
array1.push("&tags="+encodeURIComponent(tags));
array1.push("&tags="+encodeURIComponent(escape(tags)));
thisDialog.dialog("close");
$.ajax({
@ -1649,7 +1649,7 @@ function showConfigurationTab() {
var dialogBox = $(this);
dialogBox.dialog("close");
$.ajax({
data: createURL("command=updateDiskOffering&name="+encodeURIComponent(name)+"&displayText="+encodeURIComponent(display)+"&id="+diskId+"&response=json"),
data: createURL("command=updateDiskOffering&name="+encodeURIComponent(escape(name))+"&displayText="+encodeURIComponent(escape(display))+"&id="+diskId+"&response=json"),
dataType: "json",
success: function(json) {
template.find("#disk_description").text(display);
@ -1699,15 +1699,14 @@ function showConfigurationTab() {
} else {
template.addClass("smallrow_odd");
}
template.data("diskId", json.id).data("diskName", sanitizeXSS(json.name));
template.data("diskId", json.id).data("diskName", sanitizeXSS(unescape(json.name)));
template.find("#disk_id").text(json.id);
template.find("#disk_name").text(json.name);
template.find("#disk_description").text(json.displaytext);
template.find("#disk_name").text(unescape(json.name));
template.find("#disk_description").text(unescape(json.displaytext));
template.find("#disk_disksize").text(convertBytes(json.disksize));
template.find("#disk_tags").text(json.tags);
template.find("#disk_domain").text(json.domain);
template.find("#disk_ismirrored").text(json.ismirrored);
template.find("#disk_tags").text(unescape(json.tags));
template.find("#disk_domain").text(unescape(json.domain));
}
function listDiskOfferings() {

View File

@ -66,7 +66,7 @@ function showDomainsTab() {
function drawTree(id, level, container) {
$.ajax({
data: "command=listDomainChildren&id="+id+"&response=json&pageSize=-1",
data: createURL("command=listDomainChildren&id="+id+"&response=json&pageSize=-1"),
dataType: "json",
async: false,
success: function(json) {
@ -321,7 +321,7 @@ function showDomainsTab() {
rightPanelSearchResult.show();
var keyword = searchInput.val();
$.ajax({
data: "command=listDomains&keyword="+keyword+"&response=json&pageSize=-1", //pageSize=-1 will return all items (no limitation)
data: createURL("command=listDomains&keyword="+keyword+"&response=json&pageSize=-1"), //pageSize=-1 will return all items (no limitation)
dataType: "json",
async: false,
success: function(json) {
@ -350,7 +350,7 @@ function showDomainsTab() {
function drawRootNode(rootDomainId) {
treeContentBox.empty();
$.ajax({
data: "command=listDomains&id="+rootDomainId+"&response=json&pageSize=-1", //pageSize=-1 will return all items (no limitation)
data: createURL("command=listDomains&id="+rootDomainId+"&response=json&pageSize=-1"), //pageSize=-1 will return all items (no limitation)
dataType: "json",
async: false,
success: function(json) {

View File

@ -569,7 +569,7 @@ function showHostsTab() {
} else if (state == "Maintenance") {
template.find(".grid_links").find("#host_action_reconnect_container, #host_action_enable_maint_container").hide();
} else if (state == "Disconnected") {
template.find(".grid_links").find("#host_action_reconnect_container, #host_action_enable_maint_container, #host_action_cancel_maint_container, #host_action_remove_container").hide();
template.find(".grid_links").find("#host_action_reconnect_container, #host_action_enable_maint_container, #host_action_cancel_maint_container").hide();
} else {
alert("Unsupported Host State: " + state);
}

View File

@ -29,7 +29,7 @@ $(document).ready(function() {
mainContainer = $("#maincontentarea");
// Tab Links, dashboard is the initial active tab
mainContainer.load("content/tab_dashboard.html");
mainContainer.load("jsp/tab_dashboard.jsp");
// Default AJAX Setup
$.ajaxSetup({
@ -285,31 +285,31 @@ $(document).ready(function() {
if (tabId == "menutab_dashboard_user" || tabId == "menutab_dashboard_root" || tabId == "menutab_dashboard_domain") {
showDashboardTab();
} else if (tabId == "menutab_vm") {
mainContainer.load("content/tab_instances.html", function() {
mainContainer.load("jsp/tab_instances.jsp", function() {
showInstancesTab(tab.data("domainId"), tab.data("account"));
});
} else if (tabId == "menutab_networking") {
mainContainer.load("content/tab_networking.html", function() {
mainContainer.load("jsp/tab_networking.jsp", function() {
showNetworkingTab(tab.data("domainId"), tab.data("account"));
});
} else if (tabId == "menutab_templates") {
mainContainer.load("content/tab_templates.html", function() {
mainContainer.load("jsp/tab_templates.jsp", function() {
showTemplatesTab();
});
} else if (tabId == "menutab_events") {
mainContainer.load("content/tab_events.html", function() {
mainContainer.load("jsp/tab_events.jsp", function() {
showEventsTab(tab.data("showEvents"));
});
} else if (tabId == "menutab_hosts") {
mainContainer.load("content/tab_hosts.html", function() {
mainContainer.load("jsp/tab_hosts.jsp", function() {
showHostsTab();
});
} else if (tabId == "menutab_storage") {
mainContainer.load("content/tab_storage.html", function() {
mainContainer.load("jsp/tab_storage.jsp", function() {
showStorageTab(tab.data("domainId"), tab.data("targetTab"));
});
} else if (tabId == "menutab_accounts") {
mainContainer.load("content/tab_accounts.html", function() {
mainContainer.load("jsp/tab_accounts.jsp", function() {
showAccountsTab(tab.data("domainId"));
});
} else if (tabId == "menutab_domain") {
@ -317,7 +317,7 @@ $(document).ready(function() {
showDomainsTab();
});
} else if (tabId == "menutab_configuration") {
mainContainer.load("content/tab_configuration.html", function() {
mainContainer.load("jsp/tab_configuration.jsp", function() {
showConfigurationTab();
});
} else {
@ -342,7 +342,7 @@ $(document).ready(function() {
// Dashboard Tab
function showDashboardTab() {
mainContainer.load("content/tab_dashboard.html", function() {
mainContainer.load("jsp/tab_dashboard.jsp", function() {
$(".header_topright #header_username").text($.cookie("username"));
if (isAdmin()) {

View File

@ -576,7 +576,7 @@ function showInstancesTab(p_domainId, p_account) {
if (offerings != null && offerings.length > 0) {
for (var i = 0; i < offerings.length; i++) {
var option = $("<option value='" + offerings[i].id + "'>" + sanitizeXSS(offerings[i].displaytext) + "</option>").data("name", offerings[i].name);
var option = $("<option value='" + offerings[i].id + "'>" + sanitizeXSS(unescape(offerings[i].displaytext)) + "</option>").data("name", sanitizeXSS(unescape(offerings[i].name)));
offeringSelect.append(option);
}
}
@ -611,7 +611,7 @@ function showInstancesTab(p_domainId, p_account) {
vmInstance.find(".row_loading").show();
vmInstance.find(".loadingmessage_container .loadingmessage_top p").html("Your virtual instance has been upgraded. Please restart your virtual instance for the new service offering to take effect.");
vmInstance.find(".loadingmessage_container").fadeIn("slow");
vmInstance.find("#vm_service").html("<strong>Service:</strong> " + sanitizeXSS(result.virtualmachine[0].serviceofferingname));
vmInstance.find("#vm_service").html("<strong>Service:</strong> " + sanitizeXSS(unescape(result.virtualmachine[0].serviceofferingname)));
if (result.virtualmachine[0].haenable =='true') {
vmInstance.find("#vm_ha").html("<strong>HA:</strong> Enabled");
vmInstance.find("#vm_action_ha").text("Disable HA");
@ -1109,7 +1109,7 @@ function showInstancesTab(p_domainId, p_account) {
instanceTemplate.find("#vm_ip_address").html("<strong>IP Address:</strong> " + instanceJSON.ipaddress);
instanceTemplate.find("#vm_zone").html("<strong>Zone:</strong> " + sanitizeXSS(instanceJSON.zonename));
instanceTemplate.find("#vm_template").html("<strong>Template:</strong> " + sanitizeXSS(instanceJSON.templatename));
instanceTemplate.find("#vm_service").html("<strong>Service:</strong> " + sanitizeXSS(instanceJSON.serviceofferingname));
instanceTemplate.find("#vm_service").html("<strong>Service:</strong> " + sanitizeXSS(unescape(instanceJSON.serviceofferingname)));
if (instanceJSON.haenable =='true') {
instanceTemplate.find("#vm_ha").html("<strong>HA:</strong> Enabled");
instanceTemplate.find("#vm_action_ha").text("Disable HA");
@ -1277,7 +1277,7 @@ function showInstancesTab(p_domainId, p_account) {
continue;
var checked = "checked";
if (first == false) checked = "";
var listItem = $("<li><input class='radio' type='radio' name='service' id='service' value='"+offerings[i].id+"'" + checked + "/><label style='width:500px;font-size:11px;' for='service'>"+sanitizeXSS(offerings[i].displaytext)+"</label></li>");
var listItem = $("<li><input class='radio' type='radio' name='service' id='service' value='"+offerings[i].id+"'" + checked + "/><label style='width:500px;font-size:11px;' for='service'>"+sanitizeXSS(unescape(offerings[i].displaytext))+"</label></li>");
$("#wizard_service_offering").append(listItem);
first = false;
}
@ -1306,14 +1306,14 @@ function showInstancesTab(p_domainId, p_account) {
var html =
"<li>"
+"<input class='radio' type='radio' name='rootdisk' id='rootdisk' value='"+offerings[i].id+"'" + ((i==0)?"checked":"") + "/>"
+"<label style='width:500px;font-size:11px;' for='disk'>"+sanitizeXSS(offerings[i].displaytext)+"</label>"
+"<label style='width:500px;font-size:11px;' for='disk'>"+sanitizeXSS(unescape(offerings[i].displaytext))+"</label>"
+"</li>";
$("#wizard_root_disk_offering").append(html);
var html2 =
"<li>"
+"<input class='radio' type='radio' name='datadisk' id='datadisk' value='"+offerings[i].id+"'" + "/>"
+"<label style='width:500px;font-size:11px;' for='disk'>"+sanitizeXSS(offerings[i].displaytext)+"</label>"
+"<label style='width:500px;font-size:11px;' for='disk'>"+sanitizeXSS(unescape(offerings[i].displaytext))+"</label>"
+"</li>";
$("#wizard_data_disk_offering").append(html2);
}