From aa49f9f98b4abdc33a26147f54903865bfc583a2 Mon Sep 17 00:00:00 2001
From: Chiradeep Vittal
Date: Mon, 23 Aug 2010 18:40:06 -0700
Subject: [PATCH 001/235] Initial checkin of systemvm builder for debian-based
systemvm
---
tools/systemvm/buildsystemvm.sh | 293 ++++++++++++++++++++++++++++++++
1 file changed, 293 insertions(+)
create mode 100755 tools/systemvm/buildsystemvm.sh
diff --git a/tools/systemvm/buildsystemvm.sh b/tools/systemvm/buildsystemvm.sh
new file mode 100755
index 00000000000..63ce5c89fe7
--- /dev/null
+++ b/tools/systemvm/buildsystemvm.sh
@@ -0,0 +1,293 @@
+#!/bin/bash
+
+IMAGENAME=systemvm
+LOCATION=/var/lib/images/systemvm2
+PASSWORD=password
+APT_PROXY=
+HOSTNAME=systemvm
+SIZE=2000
+DEBIAN_MIRROR=ftp.us.debian.org/debian
+
+baseimage() {
+ mkdir -p $LOCATION
+ dd if=/dev/zero of=$IMAGELOC bs=1M seek=$((SIZE - 1)) count=1
+ loopdev=$(losetup -f)
+ losetup $loopdev $IMAGELOC
+ parted $loopdev -s 'mklabel msdos'
+ parted $loopdev -s 'mkpart primary ext3 512B 2097151000B'
+ losetup -d $loopdev
+ loopdev=$(losetup --show -o 512 -f $IMAGELOC )
+ mkfs.ext3 -L ROOT $loopdev
+ mkdir -p $MOUNTPOINT
+ tune2fs -c 100 -i 0 $loopdev
+ losetup -d $loopdev
+
+ mount -o loop,offset=512 $IMAGELOC $MOUNTPOINT
+
+ #debootstrap --variant=minbase --keyring=/usr/share/keyrings/debian-archive-keyring.gpg squeeze $MOUNTPOINT http://${APT_PROXY}${DEBIAN_MIRROR}
+ debootstrap --variant=minbase --arch=i386 squeeze $MOUNTPOINT http://${APT_PROXY}${DEBIAN_MIRROR}
+}
+
+
+fixapt() {
+ if [ "$APT_PROXY" != "" ]; then
+ cat >> etc/apt/apt.conf.d/01proxy << EOF
+Acquire::http::Proxy "http://${APT_PROXY}";
+EOF
+ fi
+
+ cat > etc/apt/sources.list << EOF
+deb http://ftp.us.debian.org/debian/ squeeze main non-free
+deb-src http://ftp.us.debian.org/debian/ squeeze main non-free
+
+deb http://security.debian.org/ squeeze/updates main
+deb-src http://security.debian.org/ squeeze/updates main
+
+deb http://volatile.debian.org/debian-volatile squeeze/volatile main
+deb-src http://volatile.debian.org/debian-volatile squeeze/volatile main
+
+deb http://ftp.us.debian.org/debian testing main contrib non-free
+EOF
+
+ cat >> etc/apt/apt.conf << EOF
+APT::Default-Release "stable";
+EOF
+
+ cat >> etc/apt/preferences << EOF
+Package: *
+Pin: release o=Debian,a=stable
+Pin-Priority: 900
+
+Package: *
+Pin: release o=Debian,a=testing
+Pin-Priority: 400
+EOF
+
+ #apt-key exportall | chroot . apt-key add - &&
+ chroot . apt-get update &&
+ echo "Apt::Install-Recommends 0;" > etc/apt/apt.conf.d/local-recommends
+
+ cat >> usr/sbin/policy-rc.d << EOF
+#!/bin/sh
+exit 101
+EOF
+ chmod a+x usr/sbin/policy-rc.d
+
+ cat >> etc/default/locale << EOF
+LANG=en_US.UTF-8
+LC_ALL=en_US.UTF-8
+EOF
+
+ cat >> etc/locale.gen << EOF
+en_US.UTF-8 UTF-8
+EOF
+
+ DEBIAN_FRONTEND=noninteractive
+ DEBIAN_PRIORITY=critical
+ export DEBIAN_FRONTEND DEBIAN_PRIORITY
+ chroot . dpkg-reconfigure debconf --frontend=noninteractive
+ chroot . apt-get -q -y install locales
+}
+
+network() {
+
+ echo "$HOSTNAME" > etc/hostname &&
+ cat > etc/hosts << EOF
+127.0.0.1 localhost
+# The following lines are desirable for IPv6 capable hosts
+::1 localhost ip6-localhost ip6-loopback
+fe00::0 ip6-localnet
+ff00::0 ip6-mcastprefix
+ff02::1 ip6-allnodes
+ff02::2 ip6-allrouters
+ff02::3 ip6-allhosts
+EOF
+
+ cat >> etc/network/interfaces << EOF
+auto lo
+iface lo inet loopback
+
+# The primary network interface
+allow-hotplug eth0
+iface eth0 inet dhcp
+
+EOF
+}
+
+install_kernel() {
+ DEBIAN_FRONTEND=noninteractive
+ DEBIAN_PRIORITY=critical
+ export DEBIAN_FRONTEND DEBIAN_PRIORITY
+
+ chroot . apt-get -qq -y --force-yes install grub &&
+ cp -av usr/lib/grub/i386-pc boot/grub
+ #for some reason apt-get install grub does not install grub/stage1 etc
+ loopd=$(losetup -f --show $1)
+ grub-install $loopd --root-directory=$MOUNTPOINT
+ losetup -d $loopd
+ grub << EOF &&
+device (hd0) $1
+root (hd0,0)
+setup (hd0)
+quit
+EOF
+ # install a kernel image
+ cat > etc/kernel-img.conf << EOF &&
+do_symlinks = yes
+link_in_boot = yes
+do_initrd = yes
+EOF
+ chroot . apt-get install -qq -y --force-yes linux-image-686-bigmem
+ cat >> etc/kernel-img.conf << EOF
+postinst_hook = /usr/sbin/update-grub
+postrm_hook = /usr/sbin/update-grub
+EOF
+}
+
+
+fixgrub() {
+ cat > boot/grub/menu.lst << EOF
+default 0
+timeout 2
+color cyan/blue white/blue
+
+### BEGIN AUTOMAGIC KERNELS LIST
+# kopt=root=LABEL=ROOT ro
+
+## ## End Default Options ##
+title Debian GNU/Linux, kernel 2.6.32-5-686-bigmem
+root (hd0,0)
+kernel /boot/vmlinuz-2.6.32-5-686-bigmem root=LABEL=ROOT ro console=tty0 xencons=ttyS0,115200 console=hvc0 quiet
+initrd /boot/initrd.img-2.6.32-5-686-bigmem
+
+### END DEBIAN AUTOMAGIC KERNELS LIST
+EOF
+ (cd boot/grub; ln -s menu.lst grub.conf)
+}
+
+fixinittab() {
+ cat >> etc/inittab << EOF
+
+vc:2345:respawn:/sbin/getty 38400 hvc0
+EOF
+}
+
+fixfstab() {
+ cat > etc/fstab << EOF
+#
+proc /proc proc defaults 0 0
+LABEL=ROOT / ext3 errors=remount-ro 0 1
+EOF
+}
+
+fixacpid() {
+ cat >> etc/acpi/events/power << EOF
+event=button/power.*
+action=/usr/local/sbin/power.sh "%e"
+EOF
+ cat >> usr/local/sbin/power.sh << EOF
+#!/bin/bash
+/sbin/poweroff
+EOF
+ chmod a+x usr/local/sbin/power.sh
+}
+
+packages() {
+ DEBIAN_FRONTEND=noninteractive
+ DEBIAN_PRIORITY=critical
+ DEBCONF_DB_OVERRIDE=’File{/root/config.dat}’
+ export DEBIAN_FRONTEND DEBIAN_PRIORITY DEBCONF_DB_OVERRIDE
+
+ chroot . apt-get --no-install-recommends -q -y --force-yes install rsyslog chkconfig insserv net-tools ifupdown vim netbase iptables openssh-server grub e2fsprogs dhcp3-client dnsmasq tcpdump socat wget apache2 python2.5 bzip2 sed gawk diff grep gzip less tar telnet xl2tpd traceroute openswan psmisc
+
+ chroot . apt-get --no-install-recommends -q -y --force-yes -t backports install haproxy nfs-common
+
+ echo "***** getting additional modules *********"
+ chroot . apt-get --no-install-recommends -q -y --force-yes install iproute acpid iptables-persistent
+
+ echo "***** getting sun jre 6*********"
+ DEBIAN_FRONTEND=readline
+ export DEBIAN_FRONTEND
+ chroot . echo sun-java6-jdk shared/accepted-sun-dlj-v1-1 boolean true | debconf-set-selections
+ chroot . apt-get --no-install-recommends -q -y install sun-java6-jre
+
+}
+
+password() {
+ chroot . echo "root:$PASSWORD" | chroot . chpasswd
+}
+
+cleanup() {
+ rm -f usr/sbin/policy-rc.d
+ rm -f etc/apt/apt.conf.d/01proxy
+}
+
+mkdir -p $IMAGENAME
+mkdir -p $LOCATION
+MOUNTPOINT=/mnt/$IMAGENAME/
+IMAGELOC=$LOCATION/$IMAGENAME.img
+scriptdir=$(dirname $PWD/$0)
+
+rm -f $IMAGELOC
+
+echo "*************INSTALLING BASEIMAGE********************"
+baseimage
+
+cp $scriptdir/config.dat $MOUNTPOINT/root/
+cd $MOUNTPOINT
+
+mount -o bind /proc $MOUNTPOINT/proc
+mount -o bind /dev $MOUNTPOINT/dev
+
+echo "*************CONFIGURING APT********************"
+fixapt
+echo "*************DONE CONFIGURING APT********************"
+
+echo "*************CONFIGURING NETWORK********************"
+network
+echo "*************DONE CONFIGURING NETWORK********************"
+
+echo "*************INSTALLING KERNEL********************"
+install_kernel $IMAGELOC
+echo "*************DONE INSTALLING KERNEL********************"
+
+echo "*************CONFIGURING GRUB********************"
+fixgrub $IMAGELOC
+echo "*************DONE CONFIGURING GRUB********************"
+
+
+echo "*************CONFIGURING INITTAB********************"
+fixinittab
+echo "*************DONE CONFIGURING INITTAB********************"
+
+echo "*************CONFIGURING FSTAB********************"
+fixfstab
+echo "*************DONE CONFIGURING FSTAB********************"
+
+echo "*************CONFIGURING ACPID********************"
+fixacpid
+echo "*************DONE CONFIGURING ACPID********************"
+
+#cp etc/inittab etc/inittab.hvm
+#cp $scriptdir/inittab.xen etc/inittab.xen
+#cp $scriptdir/inittab.xen etc/inittab
+#cp $scriptdir/fstab.xen etc/fstab.xen
+#cp $scriptdir/fstab.xen etc/fstab
+#cp $scriptdir/fstab etc/fstab
+
+echo "*************INSTALLING PACKAGES********************"
+packages
+echo "*************DONE INSTALLING PACKAGES********************"
+
+echo "*************CONFIGURING PASSWORD********************"
+password
+
+echo "*************CLEANING UP********************"
+cleanup
+
+cd $scriptdir
+
+umount $MOUNTPOINT/proc
+umount $MOUNTPOINT/dev
+umount $MOUNTPOINT
+
From 49900a8985ba7ba660db77bdb9e956f6b1599195 Mon Sep 17 00:00:00 2001
From: Kelven Yang
Date: Tue, 24 Aug 2010 18:58:38 -0700
Subject: [PATCH 002/235] 1) Add VMDK format 2) Make console proxy servlet
explictly return content-type header for console proxy page (this is a bug
fix change)
---
api/src/com/cloud/storage/Storage.java | 3 ++-
server/src/com/cloud/servlet/ConsoleProxyServlet.java | 2 +-
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/api/src/com/cloud/storage/Storage.java b/api/src/com/cloud/storage/Storage.java
index 106616673b3..24ceb5b3fec 100644
--- a/api/src/com/cloud/storage/Storage.java
+++ b/api/src/com/cloud/storage/Storage.java
@@ -22,7 +22,8 @@ public class Storage {
QCOW2(true, true, false),
RAW(false, false, false),
VHD(true, true, true),
- ISO(false, false, false);
+ ISO(false, false, false),
+ VMDK(true, true, true);
private final boolean thinProvisioned;
private final boolean supportSparse;
diff --git a/server/src/com/cloud/servlet/ConsoleProxyServlet.java b/server/src/com/cloud/servlet/ConsoleProxyServlet.java
index 851860f8a04..03372cbd82a 100644
--- a/server/src/com/cloud/servlet/ConsoleProxyServlet.java
+++ b/server/src/com/cloud/servlet/ConsoleProxyServlet.java
@@ -281,7 +281,7 @@ public class ConsoleProxyServlet extends HttpServlet {
}
private void sendResponse(HttpServletResponse resp, String content) {
- try {
+ try {
resp.getWriter().print(content);
} catch(IOException e) {
if(s_logger.isInfoEnabled())
From 45cb68e7e2861efc613cf0fb037c24698b5252ba Mon Sep 17 00:00:00 2001
From: Kelven Yang
Date: Tue, 24 Aug 2010 22:58:05 -0700
Subject: [PATCH 003/235] add templates.vmware.sql modify build to deploy
vmware database records
---
build/developer.xml | 9 ++++++++-
server/src/com/cloud/servlet/ConsoleProxyServlet.java | 1 +
setup/db/templates.xenserver.sql | 2 --
3 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/build/developer.xml b/build/developer.xml
index 0928e48dfd6..77d760b2af7 100755
--- a/build/developer.xml
+++ b/build/developer.xml
@@ -169,11 +169,18 @@
+
+
+
-
+
+
+
+
+
diff --git a/server/src/com/cloud/servlet/ConsoleProxyServlet.java b/server/src/com/cloud/servlet/ConsoleProxyServlet.java
index 03372cbd82a..2c364122854 100644
--- a/server/src/com/cloud/servlet/ConsoleProxyServlet.java
+++ b/server/src/com/cloud/servlet/ConsoleProxyServlet.java
@@ -282,6 +282,7 @@ public class ConsoleProxyServlet extends HttpServlet {
private void sendResponse(HttpServletResponse resp, String content) {
try {
+ resp.setContentType("text/html");
resp.getWriter().print(content);
} catch(IOException e) {
if(s_logger.isInfoEnabled())
diff --git a/setup/db/templates.xenserver.sql b/setup/db/templates.xenserver.sql
index 5ecd912f575..0432c97716f 100644
--- a/setup/db/templates.xenserver.sql
+++ b/setup/db/templates.xenserver.sql
@@ -72,6 +72,4 @@ INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (58,
INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (59, 7, 'Other install media', 'Ubuntu');
INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (60, 7, 'Other install media', 'Other');
--- temporarily added for vmware, will be moved when vmware support is fully in-place
-INSERT INTO `cloud`.`host_master`(`type`, `service_address`, `admin`, `password`) VALUES('VSphere', 'vsphere-1.lab.vmops.com', 'Administrator', 'Suite219');
From e3af2edc1d4f8ee162d658348b544c6e4aacb28c Mon Sep 17 00:00:00 2001
From: Kelven Yang
Date: Wed, 25 Aug 2010 09:48:31 -0700
Subject: [PATCH 004/235] add vmware DB initial sql scripts for templates and
guest OSes
---
setup/db/templates.vmware.sql | 82 +++++++++++++++++++++++++++++++++++
1 file changed, 82 insertions(+)
create mode 100644 setup/db/templates.vmware.sql
diff --git a/setup/db/templates.vmware.sql b/setup/db/templates.vmware.sql
new file mode 100644
index 00000000000..cc9ac751b5b
--- /dev/null
+++ b/setup/db/templates.vmware.sql
@@ -0,0 +1,82 @@
+INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones)
+ VALUES (1, 'routing', 'SystemVM Template', 0, now(), 'ext3', 0, 64, 1, 'http://nfs1.lab.vmops.com/templates/vmware/fedora11-x86.tar.bz2', '31cd7ce94fe68c973d5dc37c3349d02e', 0, 'SystemVM Template', 'VMDK', 47, 0, 1);
+INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones)
+ VALUES (2, 'fedora11-x86', 'Fedora 11 x86', 1, now(), 'ext3', 0, 32, 1, 'http://nfs1.lab.vmops.com/templates/vmware/fedora11-x86.tar.bz2', 'b63d854a9560c013142567bbae8d98cf', 0, 'Fedora 11 x86', 'VMDK', 47, 1, 1);
+
+INSERT INTO `cloud`.`guest_os_category` (id, name) VALUES (1, 'Windows');
+INSERT INTO `cloud`.`guest_os_category` (id, name) VALUES (2, 'Linux');
+INSERT INTO `cloud`.`guest_os_category` (id, name) VALUES (3, 'Novell Netware');
+INSERT INTO `cloud`.`guest_os_category` (id, name) VALUES (4, 'Solaris');
+INSERT INTO `cloud`.`guest_os_category` (id, name) VALUES (5, 'Other');
+
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (1, 1, 'Microsoft Windows 7(32-bit)', 'Microsoft Windows 7(32-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (2, 1, 'Microsoft Windows 7(64-bit)', 'Microsoft Windows 7(64-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (3, 1, 'Microsoft Windows Server 2008 R2(64-bit)', 'Microsoft Windows Server 2008 R2(64-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (4, 1, 'Microsoft Windows Server 2008(32-bit)', 'Microsoft Windows Server 2008(32-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (5, 1, 'Microsoft Windows Server 2008(64-bit)', 'Windows Windows Server 2008(64-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (6, 1, 'Microsoft Windows Server 2003, Enterprise Edition (32-bit)', 'Microsoft Windows Server 2003, Enterprise Edition (32-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (7, 1, 'Microsoft Windows Server 2003, Enterprise Edition (64-bit)', 'Microsoft Windows Server 2003, Enterprise Edition (64-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (8, 1, 'Microsoft Windows Server 2003, Datacenter Edition (32-bit)', 'Microsoft Windows Server 2003, Datacenter Edition (32-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (9, 1, 'Microsoft Windows Server 2003, Datacenter Edition (64-bit)', 'Microsoft Windows Server 2003, Datacenter Edition (64-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (10, 1, 'Microsoft Windows Server 2003, Standard Edition (32-bit)', 'Microsoft Windows Server 2003, Standard Edition (32-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (11, 1, 'Microsoft Windows Server 2003, Standard Edition (64-bit)', 'Microsoft Windows Server 2003, Standard Edition (64-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (12, 1, 'Microsoft Windows Server 2003, Web Edition', 'Microsoft Windows Server 2003, Web Edition');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (13, 1, 'Microsoft Small Bussiness Server 2003', 'Microsoft Small Bussiness Server 2003');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (14, 1, 'Microsoft Windows Vista (32-bit)', 'Microsoft Windows Vista (32-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (15, 1, 'Microsoft Windows Vista (64-bit)', 'Microsoft Windows Vista (64-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (16, 1, 'Microsoft Windows XP Professional (32-bit)', 'Microsoft Windows XP Professional (32-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (17, 1, 'Microsoft Windows XP Professional (64-bit)', 'Microsoft Windows XP Professional (64-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (18, 1, 'Microsoft Windows 2000 Advanced Server', 'Microsoft Windows 2000 Advanced Server');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (19, 1, 'Microsoft Windows 2000 Server', 'Microsoft Windows 2000 Server');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (20, 1, 'Microsoft Windows 2000 Professional', 'Microsoft Windows 2000 Professional');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (21, 1, 'Microsoft Windows 98', 'Microsoft Windows 98');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (22, 1, 'Microsoft Windows 95', 'Microsoft Windows 95');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (23, 1, 'Microsoft Windows NT 4', 'Microsoft Windows NT 4');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (24, 1, 'Microsoft Windows 3.1', 'Microsoft Windows 3.1');
+
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (25, 2, 'Red Hat Enterprise Linux 5(32-bit)', 'Red Hat Enterprise Linux 5(32-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (26, 2, 'Red Hat Enterprise Linux 5(64-bit)', 'Red Hat Enterprise Linux 5(64-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (27, 2, 'Red Hat Enterprise Linux 4(32-bit)', 'Red Hat Enterprise Linux 4(32-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (28, 2, 'Red Hat Enterprise Linux 4(64-bit)', 'Red Hat Enterprise Linux 4(64-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (29, 2, 'Red Hat Enterprise Linux 3(32-bit)', 'Red Hat Enterprise Linux 3(32-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (30, 2, 'Red Hat Enterprise Linux 3(64-bit)', 'Red Hat Enterprise Linux 3(64-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (31, 2, 'Red Hat Enterprise Linux 2', 'Red Hat Enterprise Linux 2');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (32, 2, 'Suse Linux Enterprise 11(32-bit)', 'Suse Linux Enterprise 11(32-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (33, 2, 'Suse Linux Enterprise 11(64-bit)', 'Suse Linux Enterprise 11(64-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (34, 2, 'Suse Linux Enterprise 10(32-bit)', 'Suse Linux Enterprise 10(32-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (35, 2, 'Suse Linux Enterprise 10(64-bit)', 'Suse Linux Enterprise 10(64-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (36, 2, 'Suse Linux Enterprise 8/9(32-bit)', 'Suse Linux Enterprise 8/9(32-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (37, 2, 'Suse Linux Enterprise 8/9(64-bit)', 'Suse Linux Enterprise 8/9(64-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (38, 2, 'Open Enterprise Server', 'Open Enterprise Server');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (39, 2, 'Asianux 3(32-bit)', 'Asianux 3(32-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (40, 2, 'Asianux 3(64-bit)', 'Asianux 3(64-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (41, 2, 'Debian GNU/Linux 5(32-bit)', 'Debian GNU/Linux 5(32-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (42, 2, 'Debian GNU/Linux 5(64-bit)', 'Debian GNU/Linux 5(64-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (43, 2, 'Debian GNU/Linux 4(32-bit)', 'Debian GNU/Linux 4(32-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (44, 2, 'Debian GNU/Linux 4(64-bit)', 'Debian GNU/Linux 4(64-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (45, 2, 'Ubuntu Linux (32-bit)', 'Ubuntu Linux (32-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (46, 2, 'Ubuntu Linux (64-bit)', 'Ubuntu Linux (64-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (47, 2, 'Other 2.6x Linux (32-bit)', 'Other 2.6x Linux (32-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (48, 2, 'Other 2.6x Linux (64-bit)', 'Other 2.6x Linux (64-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (49, 2, 'Other Linux (32-bit)', 'Other Linux (32-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (50, 2, 'Other Linux (64-bit)', 'Other Linux (64-bit)');
+
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (51, 3, 'Novell Netware 6.x', 'Novell Netware 6.x');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (52, 3, 'Novell Netware 5.1', 'Novell Netware 5.1');
+
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (53, 4, 'Sun Solaris 10(32-bit)', 'Sun Solaris 10(32-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (54, 4, 'Sun Solaris 10(64-bit)', 'Sun Solaris 10(64-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (55, 4, 'Sun Solaris 9(Experimental)', 'Sun Solaris 9(Experimental)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (56, 4, 'Sun Solaris 8(Experimental)', 'Sun Solaris 8(Experimental)');
+
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (57, 5, 'FreeBSD (32-bit)', 'FreeBSD (32-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (58, 5, 'FreeBSD (64-bit)', 'FreeBSD (64-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (59, 5, 'OS/2', 'OS/2');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (60, 5, 'SCO OpenServer 5', 'SCO OpenServer 5');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (61, 5, 'SCO UnixWare 7', 'SCO UnixWare 7');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (62, 5, 'DOS', 'DOS');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (63, 5, 'Other (32-bit)', 'Other (32-bit)');
+INSERT INTO `cloud`.`guest_os` (id, category_id, name, display_name) VALUES (64, 5, 'Other (64-bit)', 'Other (64-bit)');
+
+-- temporarily added for vmware, will be moved when vmware support is fully in-place
+INSERT INTO `cloud`.`host_master`(`type`, `service_address`, `admin`, `password`) VALUES('VSphere', 'vsphere-1.lab.vmops.com', 'Administrator', 'Suite219');
From 0682d70ce60aab521220a80bb1d1fdf2ac7b990f Mon Sep 17 00:00:00 2001
From: Kelven Yang
Date: Wed, 25 Aug 2010 11:07:27 -0700
Subject: [PATCH 005/235] add correct check sum to default vmware template
records Let StoragePoolMonitor be aware of vmware hypervisor
---
server/src/com/cloud/storage/StorageManagerImpl.java | 4 ++++
server/src/com/cloud/storage/listener/StoragePoolMonitor.java | 3 ++-
setup/db/templates.vmware.sql | 4 ++--
3 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java
index 99c13301707..d3f2156f79d 100644
--- a/server/src/com/cloud/storage/StorageManagerImpl.java
+++ b/server/src/com/cloud/storage/StorageManagerImpl.java
@@ -1062,6 +1062,8 @@ public class StorageManagerImpl implements StorageManager {
String hypervisoType = configDao.getValue("hypervisor.type");
if (hypervisoType.equalsIgnoreCase("KVM")) {
_hypervisorType = Hypervisor.Type.KVM;
+ } else if(hypervisoType.equalsIgnoreCase("vmware")) {
+ _hypervisorType = Hypervisor.Type.VmWare;
}
_agentMgr.registerForHostEvents(new StoragePoolMonitor(this, _hostDao, _storagePoolDao), true, false, true);
@@ -1256,6 +1258,8 @@ public class StorageManagerImpl implements StorageManager {
if (hypervisorType == null) {
if (_hypervisorType == Hypervisor.Type.KVM) {
hypervisorType = Hypervisor.Type.KVM;
+ } else if(_hypervisorType == Hypervisor.Type.VmWare) {
+ hypervisorType = Hypervisor.Type.VmWare;
} else {
s_logger.debug("Couldn't find a host to serve in the server pool");
return null;
diff --git a/server/src/com/cloud/storage/listener/StoragePoolMonitor.java b/server/src/com/cloud/storage/listener/StoragePoolMonitor.java
index b66ffe2a374..7017ed83c2a 100755
--- a/server/src/com/cloud/storage/listener/StoragePoolMonitor.java
+++ b/server/src/com/cloud/storage/listener/StoragePoolMonitor.java
@@ -70,7 +70,8 @@ public class StoragePoolMonitor implements Listener {
public boolean processConnect(HostVO host, StartupCommand cmd) {
if (cmd instanceof StartupRoutingCommand) {
StartupRoutingCommand scCmd = (StartupRoutingCommand)cmd;
- if (scCmd.getHypervisorType() == Hypervisor.Type.XenServer || scCmd.getHypervisorType() == Hypervisor.Type.KVM) {
+ if (scCmd.getHypervisorType() == Hypervisor.Type.XenServer || scCmd.getHypervisorType() == Hypervisor.Type.KVM ||
+ scCmd.getHypervisorType() == Hypervisor.Type.VmWare) {
List pools = _poolDao.listBy(host.getDataCenterId(), host.getPodId(), host.getClusterId());
for (StoragePoolVO pool : pools) {
Long hostId = host.getId();
diff --git a/setup/db/templates.vmware.sql b/setup/db/templates.vmware.sql
index cc9ac751b5b..572e42107a9 100644
--- a/setup/db/templates.vmware.sql
+++ b/setup/db/templates.vmware.sql
@@ -1,7 +1,7 @@
INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones)
- VALUES (1, 'routing', 'SystemVM Template', 0, now(), 'ext3', 0, 64, 1, 'http://nfs1.lab.vmops.com/templates/vmware/fedora11-x86.tar.bz2', '31cd7ce94fe68c973d5dc37c3349d02e', 0, 'SystemVM Template', 'VMDK', 47, 0, 1);
+ VALUES (1, 'routing', 'SystemVM Template', 0, now(), 'ext3', 0, 64, 1, 'http://nfs1.lab.vmops.com/templates/vmware/fedora11-x86.tar.bz2', '7957ff05cae838689eb53c7600b2fbe4', 0, 'SystemVM Template', 'VMDK', 47, 0, 1);
INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones)
- VALUES (2, 'fedora11-x86', 'Fedora 11 x86', 1, now(), 'ext3', 0, 32, 1, 'http://nfs1.lab.vmops.com/templates/vmware/fedora11-x86.tar.bz2', 'b63d854a9560c013142567bbae8d98cf', 0, 'Fedora 11 x86', 'VMDK', 47, 1, 1);
+ VALUES (2, 'fedora11-x86', 'Fedora 11 x86', 1, now(), 'ext3', 0, 32, 1, 'http://nfs1.lab.vmops.com/templates/vmware/fedora11-x86.tar.bz2', '7957ff05cae838689eb53c7600b2fbe4', 0, 'Fedora 11 x86', 'VMDK', 47, 1, 1);
INSERT INTO `cloud`.`guest_os_category` (id, name) VALUES (1, 'Windows');
INSERT INTO `cloud`.`guest_os_category` (id, name) VALUES (2, 'Linux');
From 63ebb004346ec25ae6c65c80b9462fd3e536025d Mon Sep 17 00:00:00 2001
From: Kelven Yang
Date: Wed, 25 Aug 2010 11:59:18 -0700
Subject: [PATCH 006/235] Add VMDK processor for template processing at
secondary storage
---
.../storage/template/DownloadManagerImpl.java | 5 ++
.../cloud/storage/template/VmdkProcessor.java | 67 +++++++++++++++++++
2 files changed, 72 insertions(+)
create mode 100644 core/src/com/cloud/storage/template/VmdkProcessor.java
diff --git a/core/src/com/cloud/storage/template/DownloadManagerImpl.java b/core/src/com/cloud/storage/template/DownloadManagerImpl.java
index 2ec957a6d8a..8d41e293e6a 100644
--- a/core/src/com/cloud/storage/template/DownloadManagerImpl.java
+++ b/core/src/com/cloud/storage/template/DownloadManagerImpl.java
@@ -781,6 +781,11 @@ public class DownloadManagerImpl implements DownloadManager {
processor = new QCOW2Processor();
processor.configure("QCOW2 Processor", params);
processors.add(processor);
+
+ processor = new VmdkProcessor();
+ processor.configure("VMDK Processor", params);
+ processors.add(processor);
+
// Add more processors here.
threadPool = Executors.newFixedThreadPool(numInstallThreads);
return true;
diff --git a/core/src/com/cloud/storage/template/VmdkProcessor.java b/core/src/com/cloud/storage/template/VmdkProcessor.java
new file mode 100644
index 00000000000..b8d037c3538
--- /dev/null
+++ b/core/src/com/cloud/storage/template/VmdkProcessor.java
@@ -0,0 +1,67 @@
+package com.cloud.storage.template;
+
+import java.io.File;
+import java.util.Map;
+
+import javax.naming.ConfigurationException;
+
+import org.apache.log4j.Logger;
+
+import com.cloud.exception.InternalErrorException;
+import com.cloud.storage.StorageLayer;
+import com.cloud.storage.Storage.ImageFormat;
+
+public class VmdkProcessor implements Processor {
+ private static final Logger s_logger = Logger.getLogger(VmdkProcessor.class);
+
+ String _name;
+ StorageLayer _storage;
+
+ @Override
+ public FormatInfo process(String templatePath, ImageFormat format, String templateName) throws InternalErrorException {
+ if (format != null) {
+ s_logger.debug("We currently don't handle conversion from " + format + " to VMDK.");
+ return null;
+ }
+
+ s_logger.info("Template processing. templatePath: " + templatePath + ", templateName: " + templateName);
+ String templateFilePath = templatePath + File.separator + templateName + ".tar.bz2";
+ if (!_storage.exists(templateFilePath)) {
+ s_logger.debug("Unable to find the vmware template file: " + templateFilePath);
+ return null;
+ }
+
+ FormatInfo info = new FormatInfo();
+ info.format = ImageFormat.VMDK;
+ info.filename = templateName + ".tar.bz2";
+ info.size = _storage.getSize(templateFilePath);
+ info.virtualSize = info.size;
+ return info;
+ }
+
+ @Override
+ public boolean configure(String name, Map params) throws ConfigurationException {
+ _name = name;
+ _storage = (StorageLayer)params.get(StorageLayer.InstanceConfigKey);
+ if (_storage == null) {
+ throw new ConfigurationException("Unable to get storage implementation");
+ }
+
+ return true;
+ }
+
+ @Override
+ public String getName() {
+ return _name;
+ }
+
+ @Override
+ public boolean start() {
+ return true;
+ }
+
+ @Override
+ public boolean stop() {
+ return true;
+ }
+}
From 4fe1d8f335d909f1fc378256066aa5c3d89dc189 Mon Sep 17 00:00:00 2001
From: edison
Date: Wed, 25 Aug 2010 12:25:05 -0700
Subject: [PATCH 007/235] add a web-based Ip Allocator: In external-ip mode,
management server can get user VM's ip from
direct.attach.network.externalIpAllocator.url. This simple tool provides such
kind of ip allocator service.
How to:
1. setup the dnsmasq:
add the following in dnsmasq.conf:
dhcp-range=starting-ip-allocate-to-vm,end-ip,netmask,static
dhcp-option=option:router,gateway
2. run cloud-web-ipallocator,
The default listing port is 8080, if it's used by others, change the port by:
cloud-web-ipallocator other-port
3. set the following in direct.attach.network.externalIpAllocator.url:
http://your-host-ip:listening-port/ipallocator
---
python/bindir/cloud-web-ipallocator.in | 136 +++++++++++++++++++++++++
1 file changed, 136 insertions(+)
create mode 100755 python/bindir/cloud-web-ipallocator.in
diff --git a/python/bindir/cloud-web-ipallocator.in b/python/bindir/cloud-web-ipallocator.in
new file mode 100755
index 00000000000..3a278d29e56
--- /dev/null
+++ b/python/bindir/cloud-web-ipallocator.in
@@ -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()
From 0a35a8120ddacff63127fce9b24e326f104efef0 Mon Sep 17 00:00:00 2001
From: edison
Date: Mon, 16 Aug 2010 19:35:08 -0700
Subject: [PATCH 008/235] Oh, why there is so many un-compatible libvirt...
---
.../computing/LibvirtComputingResource.java | 21 ++++++++++++++++---
1 file changed, 18 insertions(+), 3 deletions(-)
diff --git a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java
index 574b3669113..fdc050d7cca 100644
--- a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java
+++ b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java
@@ -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");
}
@@ -3502,6 +3501,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 {
From 398d38b38c83579452e92ec817396189536b84ab Mon Sep 17 00:00:00 2001
From: edison
Date: Tue, 17 Aug 2010 16:48:46 -0700
Subject: [PATCH 009/235] rename qemu-kvm to cloud-qemu-system*
---
.../agent/resource/computing/LibvirtComputingResource.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java
index fdc050d7cca..755a739448d 100644
--- a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java
+++ b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java
@@ -2941,9 +2941,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;
From 867b49edb6401ba9a5639e524630586f81e07822 Mon Sep 17 00:00:00 2001
From: edison
Date: Tue, 17 Aug 2010 16:52:52 -0700
Subject: [PATCH 010/235] Don't install console proxy agent on agent
---
scripts/vm/hypervisor/kvm/setup_agent.sh | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/scripts/vm/hypervisor/kvm/setup_agent.sh b/scripts/vm/hypervisor/kvm/setup_agent.sh
index 7697aaa0d0b..1c0a18112df 100755
--- a/scripts/vm/hypervisor/kvm/setup_agent.sh
+++ b/scripts/vm/hypervisor/kvm/setup_agent.sh
@@ -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
From dc14cb4b3d3c0230d99860d087d3d1e0fefb1543 Mon Sep 17 00:00:00 2001
From: edison
Date: Wed, 18 Aug 2010 12:26:43 -0700
Subject: [PATCH 011/235] fix vlan dev naming issue: don't naming it by ourself
---
.../agent/resource/computing/LibvirtComputingResource.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java
index 755a739448d..67398b29f92 100644
--- a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java
+++ b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java
@@ -3097,7 +3097,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);
@@ -3113,7 +3113,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;
From ea3bbcb4641a18a7456e127315d0a1bb58cf5297 Mon Sep 17 00:00:00 2001
From: edison
Date: Wed, 18 Aug 2010 16:28:22 -0700
Subject: [PATCH 012/235] fix attaching disk
---
.../agent/resource/computing/LibvirtComputingResource.java | 2 +-
.../cloud/agent/resource/computing/LibvirtDomainXMLParser.java | 2 ++
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java
index 67398b29f92..fa346e79b1f 100644
--- a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java
+++ b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java
@@ -2360,7 +2360,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
Iterator> itr = entrySet.iterator();
while (itr.hasNext()) {
Map.Entry entry = itr.next();
- if (entry.getValue().equalsIgnoreCase(sourceFile)) {
+ if ((entry.getValue() != null) && (entry.getValue().equalsIgnoreCase(sourceFile))) {
diskDev = entry.getKey();
break;
}
diff --git a/agent/src/com/cloud/agent/resource/computing/LibvirtDomainXMLParser.java b/agent/src/com/cloud/agent/resource/computing/LibvirtDomainXMLParser.java
index 779962af0a4..b5271c8e62c 100644
--- a/agent/src/com/cloud/agent/resource/computing/LibvirtDomainXMLParser.java
+++ b/agent/src/com/cloud/agent/resource/computing/LibvirtDomainXMLParser.java
@@ -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;
}
From 3ab4651cf0f38f4c5508fa4eecd9d9a8dfeb9add Mon Sep 17 00:00:00 2001
From: edison
Date: Thu, 19 Aug 2010 21:36:51 -0700
Subject: [PATCH 013/235] Issue #: 5978 5977 5971 5972 Status 5978: resolved
fixed Status 5977: resolved fixed Status 5971: resolved fixed Status 5972:
resolved fixed
---
.../computing/LibvirtComputingResource.java | 177 ++++++++++++++----
scripts/storage/qcow2/createtmplt.sh | 34 +++-
scripts/storage/qcow2/managesnapshot.sh | 44 +++--
.../com/cloud/storage/StorageManagerImpl.java | 6 +-
.../storage/snapshot/SnapshotManagerImpl.java | 4 +-
.../src/com/cloud/vm/UserVmManagerImpl.java | 8 +-
6 files changed, 203 insertions(+), 70 deletions(-)
diff --git a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java
index fa346e79b1f..6ae752fd200 100644
--- a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java
+++ b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java
@@ -1228,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());
@@ -1259,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) {
@@ -1356,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);
@@ -1403,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 params = new HashMap();
+ 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,
@@ -1453,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 {
@@ -3165,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();
diff --git a/scripts/storage/qcow2/createtmplt.sh b/scripts/storage/qcow2/createtmplt.sh
index 55efe952af5..ef75c6270e9 100755
--- a/scripts/storage/qcow2/createtmplt.sh
+++ b/scripts/storage/qcow2/createtmplt.sh
@@ -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
diff --git a/scripts/storage/qcow2/managesnapshot.sh b/scripts/storage/qcow2/managesnapshot.sh
index 3c7692161d6..d9b339267a0 100755
--- a/scripts/storage/qcow2/managesnapshot.sh
+++ b/scripts/storage/qcow2/managesnapshot.sh
@@ -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
diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java
index d3f2156f79d..53395a5a130 100644
--- a/server/src/com/cloud/storage/StorageManagerImpl.java
+++ b/server/src/com/cloud/storage/StorageManagerImpl.java
@@ -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 poolHosts = _poolHostDao.listByHostStatus(poolVO.getId(), Status.Up);
Collections.shuffle(poolHosts);
diff --git a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java
index a372e17b6e8..c6f82d2f567 100644
--- a/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java
+++ b/server/src/com/cloud/storage/snapshot/SnapshotManagerImpl.java
@@ -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();
diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java
index 7a26cc7d100..721f73e3eb4 100755
--- a/server/src/com/cloud/vm/UserVmManagerImpl.java
+++ b/server/src/com/cloud/vm/UserVmManagerImpl.java
@@ -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 vols = _volsDao.findCreatedByInstance(vm.getId());
+ List vos = new ArrayList();
+ /*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;
From 3c92e52886fc8ee8fb8902ddc5f0185f970f88ae Mon Sep 17 00:00:00 2001
From: jessica
Date: Wed, 25 Aug 2010 15:48:08 -0700
Subject: [PATCH 014/235] Issue #: 5785 - support non-ascii character like euro
character
---
ui/scripts/cloud.core.configuration.js | 39 +++++++++++++-------------
ui/scripts/cloud.core.instances.js | 12 ++++----
2 files changed, 25 insertions(+), 26 deletions(-)
diff --git a/ui/scripts/cloud.core.configuration.js b/ui/scripts/cloud.core.configuration.js
index d3ffd9022ae..d648e4a53eb 100644
--- a/ui/scripts/cloud.core.configuration.js
+++ b/ui/scripts/cloud.core.configuration.js
@@ -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() {
diff --git a/ui/scripts/cloud.core.instances.js b/ui/scripts/cloud.core.instances.js
index ab2bbf17837..e5a9865f48b 100644
--- a/ui/scripts/cloud.core.instances.js
+++ b/ui/scripts/cloud.core.instances.js
@@ -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 = $("").data("name", offerings[i].name);
+ var 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("Service: " + sanitizeXSS(result.virtualmachine[0].serviceofferingname));
+ vmInstance.find("#vm_service").html("Service: " + sanitizeXSS(unescape(result.virtualmachine[0].serviceofferingname)));
if (result.virtualmachine[0].haenable =='true') {
vmInstance.find("#vm_ha").html("HA: 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("IP Address: " + instanceJSON.ipaddress);
instanceTemplate.find("#vm_zone").html("Zone: " + sanitizeXSS(instanceJSON.zonename));
instanceTemplate.find("#vm_template").html("Template: " + sanitizeXSS(instanceJSON.templatename));
- instanceTemplate.find("#vm_service").html("Service: " + sanitizeXSS(instanceJSON.serviceofferingname));
+ instanceTemplate.find("#vm_service").html("Service: " + sanitizeXSS(unescape(instanceJSON.serviceofferingname)));
if (instanceJSON.haenable =='true') {
instanceTemplate.find("#vm_ha").html("HA: 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 = $("");
+ var listItem = $("");
$("#wizard_service_offering").append(listItem);
first = false;
}
@@ -1306,14 +1306,14 @@ function showInstancesTab(p_domainId, p_account) {
var html =
"
"
+""
- +""
+ +""
+"
";
$("#wizard_root_disk_offering").append(html);
var html2 =
"
"
+""
- +""
+ +""
+"
";
$("#wizard_data_disk_offering").append(html2);
}
From 111f88a1dca2ed69f142c7767a7c3616231a4186 Mon Sep 17 00:00:00 2001
From: jessica
Date: Wed, 25 Aug 2010 16:33:15 -0700
Subject: [PATCH 015/235] Issue #: 5953 - show remove link when host status is
disconnected
---
ui/scripts/cloud.core.hosts.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ui/scripts/cloud.core.hosts.js b/ui/scripts/cloud.core.hosts.js
index 3316b5b19b8..d89c2249f0b 100644
--- a/ui/scripts/cloud.core.hosts.js
+++ b/ui/scripts/cloud.core.hosts.js
@@ -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);
}
From e5bdec33f9f316ad797a61ea46824d3ff905bd18 Mon Sep 17 00:00:00 2001
From: jessica
Date: Wed, 25 Aug 2010 17:09:48 -0700
Subject: [PATCH 016/235] Issue #: 5979 - change text on VM Wizard Step 3.
---
ui/content/tab_instances.html | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/ui/content/tab_instances.html b/ui/content/tab_instances.html
index 9bc3b94701d..55991f3ff01 100644
--- a/ui/content/tab_instances.html
+++ b/ui/content/tab_instances.html
@@ -704,8 +704,7 @@
Step 3: Optional
- To create a new instance, please first select a zone you wish to have your virtual
- instance hosted on.
+ 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.)
From 23a38bc2be53254659c58f923c44115b2ba845d2 Mon Sep 17 00:00:00 2001
From: Kelven Yang
Date: Wed, 25 Aug 2010 18:17:20 -0700
Subject: [PATCH 017/235] Debug & Test template copy from secondary storage to
primary stroage on vmware
---
api/src/com/cloud/storage/Storage.java | 16 ++++++++++--
.../PrimaryStorageDownloadCommand.java | 26 +++++++++++++++++++
.../cloud/storage/template/VmdkProcessor.java | 10 ++++---
.../cloud/template/TemplateManagerImpl.java | 8 +++++-
utils/src/com/cloud/utils/DateUtil.java | 14 ++++++++--
5 files changed, 65 insertions(+), 9 deletions(-)
diff --git a/api/src/com/cloud/storage/Storage.java b/api/src/com/cloud/storage/Storage.java
index 24ceb5b3fec..7ebdc5e187e 100644
--- a/api/src/com/cloud/storage/Storage.java
+++ b/api/src/com/cloud/storage/Storage.java
@@ -23,16 +23,25 @@ public class Storage {
RAW(false, false, false),
VHD(true, true, true),
ISO(false, false, false),
- VMDK(true, true, true);
+ VMDK(true, true, true, ".tar.bz2");
private final boolean thinProvisioned;
private final boolean supportSparse;
private final boolean supportSnapshot;
+ private final String fileExtension;
private ImageFormat(boolean thinProvisioned, boolean supportSparse, boolean supportSnapshot) {
this.thinProvisioned = thinProvisioned;
this.supportSparse = supportSparse;
this.supportSnapshot = supportSnapshot;
+ fileExtension = null;
+ }
+
+ private ImageFormat(boolean thinProvisioned, boolean supportSparse, boolean supportSnapshot, String fileExtension) {
+ this.thinProvisioned = thinProvisioned;
+ this.supportSparse = supportSparse;
+ this.supportSnapshot = supportSnapshot;
+ this.fileExtension = fileExtension;
}
public boolean isThinProvisioned() {
@@ -48,7 +57,10 @@ public class Storage {
}
public String getFileExtension() {
- return toString().toLowerCase();
+ if(fileExtension == null)
+ return toString().toLowerCase();
+
+ return fileExtension;
}
}
diff --git a/core/src/com/cloud/agent/api/storage/PrimaryStorageDownloadCommand.java b/core/src/com/cloud/agent/api/storage/PrimaryStorageDownloadCommand.java
index a9010d5782e..f11f17f1bb5 100644
--- a/core/src/com/cloud/agent/api/storage/PrimaryStorageDownloadCommand.java
+++ b/core/src/com/cloud/agent/api/storage/PrimaryStorageDownloadCommand.java
@@ -28,6 +28,16 @@ public class PrimaryStorageDownloadCommand extends AbstractDownloadCommand {
String localPath;
String poolUuid;
long poolId;
+
+ //
+ // Temporary hacking to make vmware work quickly, expose NFS raw information to allow
+ // agent do quick copy over NFS.
+ //
+ // provide storage URL (it contains all information to help agent resource to mount the
+ // storage if needed, example of such URL may be as following
+ // nfs://192.168.10.231/export/home/kelven/vmware-test/secondary
+ String secondaryStorageUrl;
+ String primaryStorageUrl;
protected PrimaryStorageDownloadCommand() {
}
@@ -54,6 +64,22 @@ public class PrimaryStorageDownloadCommand extends AbstractDownloadCommand {
return localPath;
}
+ public void setSecondaryStorageUrl(String url) {
+ secondaryStorageUrl = url;
+ }
+
+ public String getSecondaryStorageUrl() {
+ return secondaryStorageUrl;
+ }
+
+ public void setPrimaryStorageUrl(String url) {
+ primaryStorageUrl = url;
+ }
+
+ public String getPrimaryStorageUrl() {
+ return primaryStorageUrl;
+ }
+
@Override
public boolean executeInSequence() {
return true;
diff --git a/core/src/com/cloud/storage/template/VmdkProcessor.java b/core/src/com/cloud/storage/template/VmdkProcessor.java
index b8d037c3538..fe060ab02de 100644
--- a/core/src/com/cloud/storage/template/VmdkProcessor.java
+++ b/core/src/com/cloud/storage/template/VmdkProcessor.java
@@ -20,20 +20,22 @@ public class VmdkProcessor implements Processor {
@Override
public FormatInfo process(String templatePath, ImageFormat format, String templateName) throws InternalErrorException {
if (format != null) {
- s_logger.debug("We currently don't handle conversion from " + format + " to VMDK.");
+ if(s_logger.isInfoEnabled())
+ s_logger.info("We currently don't handle conversion from " + format + " to VMDK.");
return null;
}
s_logger.info("Template processing. templatePath: " + templatePath + ", templateName: " + templateName);
- String templateFilePath = templatePath + File.separator + templateName + ".tar.bz2";
+ String templateFilePath = templatePath + File.separator + templateName + ImageFormat.VMDK.getFileExtension();
if (!_storage.exists(templateFilePath)) {
- s_logger.debug("Unable to find the vmware template file: " + templateFilePath);
+ if(s_logger.isInfoEnabled())
+ s_logger.info("Unable to find the vmware template file: " + templateFilePath);
return null;
}
FormatInfo info = new FormatInfo();
info.format = ImageFormat.VMDK;
- info.filename = templateName + ".tar.bz2";
+ info.filename = templateName + ImageFormat.VMDK.getFileExtension();
info.size = _storage.getSize(templateFilePath);
info.virtualSize = info.size;
return info;
diff --git a/server/src/com/cloud/template/TemplateManagerImpl.java b/server/src/com/cloud/template/TemplateManagerImpl.java
index 700aa85c42c..71fe9be0052 100644
--- a/server/src/com/cloud/template/TemplateManagerImpl.java
+++ b/server/src/com/cloud/template/TemplateManagerImpl.java
@@ -223,7 +223,13 @@ public class TemplateManagerImpl implements TemplateManager {
return templateStoragePoolRef;
}
String url = origUrl + "/" + templateHostRef.getInstallPath();
- PrimaryStorageDownloadCommand dcmd = new PrimaryStorageDownloadCommand(template.getUniqueName(), url, template.getFormat(), template.getAccountId(), pool.getId(), pool.getUuid());
+ PrimaryStorageDownloadCommand dcmd = new PrimaryStorageDownloadCommand(template.getUniqueName(), url, template.getFormat(),
+ template.getAccountId(), pool.getId(), pool.getUuid());
+ HostVO secondaryStorageHost = _hostDao.findSecondaryStorageHost(pool.getDataCenterId());
+ assert(secondaryStorageHost != null);
+ dcmd.setSecondaryStorageUrl(secondaryStorageHost.getStorageUrl());
+ // TODO temporary hacking, hard-coded to NFS primary data store
+ dcmd.setPrimaryStorageUrl("nfs://" + pool.getHostAddress() + pool.getPath());
for (StoragePoolHostVO vo : vos) {
if (s_logger.isDebugEnabled()) {
diff --git a/utils/src/com/cloud/utils/DateUtil.java b/utils/src/com/cloud/utils/DateUtil.java
index 436bb8df231..c6659a7cfe1 100644
--- a/utils/src/com/cloud/utils/DateUtil.java
+++ b/utils/src/com/cloud/utils/DateUtil.java
@@ -18,6 +18,7 @@
package com.cloud.utils;
+import java.net.URI;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
@@ -235,14 +236,22 @@ public class DateUtil {
throw new CloudRuntimeException("Incorrect interval: "+type.toString());
}
-
return scheduleTime.getTime();
}
// test only
public static void main(String[] args) {
-
+ try {
+ URI uri = new URI("nfs://192.168.10.231/export/home/kelven/vmware-test/secondary");
+ System.out.println("protocol: " + uri.getScheme());
+ System.out.println("Host: " + uri.getHost());
+ System.out.println("path: " + uri.getPath());
+ System.out.println("port: " + uri.getPort());
+ } catch(Exception e) {
+ }
+
+/*
TimeZone localTimezone = Calendar.getInstance().getTimeZone();
TimeZone gmtTimezone = TimeZone.getTimeZone("GMT");
TimeZone estTimezone = TimeZone.getTimeZone("EST");
@@ -265,6 +274,7 @@ public class DateUtil {
System.out.println("Parsed TZ time string : "+ dtParsed.toString());
} catch (ParseException e) {
}
+*/
}
}
From f8c93cd5fa5a9dbcfb465b6ba3f057479fd2f740 Mon Sep 17 00:00:00 2001
From: will
Date: Wed, 25 Aug 2010 18:20:49 -0700
Subject: [PATCH 018/235] Bug #:5975
Merge from 2.1.x
- Fixed issue where listAccounts only return one less than the actual number of accounts in the system. That is because the SQL query asks for X accounts, but the API filters out the SYSTEM account. The fix is to add the filter of the system account in the actual query itself rather than have the code do it.
Conflicts:
server/src/com/cloud/api/commands/ListAccountsCmd.java
---
.../cloud/api/commands/ListAccountsCmd.java | 408 +++++++++---------
.../cloud/server/ManagementServerImpl.java | 4 +
2 files changed, 207 insertions(+), 205 deletions(-)
diff --git a/server/src/com/cloud/api/commands/ListAccountsCmd.java b/server/src/com/cloud/api/commands/ListAccountsCmd.java
index 294248fabd0..f2f8561c23f 100644
--- a/server/src/com/cloud/api/commands/ListAccountsCmd.java
+++ b/server/src/com/cloud/api/commands/ListAccountsCmd.java
@@ -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> s_properties = new ArrayList>();
-
- static {
- s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.FALSE));
- s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE));
- s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_TYPE, Boolean.FALSE));
- s_properties.add(new Pair(BaseCmd.Properties.STATE, Boolean.FALSE));
- s_properties.add(new Pair(BaseCmd.Properties.IS_CLEANUP_REQUIRED, Boolean.FALSE));
- s_properties.add(new Pair(BaseCmd.Properties.KEYWORD, Boolean.FALSE));
- s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE));
- s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE));
- s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE));
- s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE));
- s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE));
- }
-
- public String getName() {
- return s_name;
- }
- public List> getProperties() {
- return s_properties;
- }
-
- @Override
- public List> execute(Map 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 accounts = getManagementServer().searchForAccounts(c);
-
- List> accountTags = new ArrayList>();
- 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> accountData = new ArrayList>();
- accountData.add(new Pair(BaseCmd.Properties.ID.getName(), Long.valueOf(accountO.getId()).toString()));
- accountData.add(new Pair(BaseCmd.Properties.NAME.getName(), accountO.getAccountName()));
- accountData.add(new Pair(BaseCmd.Properties.ACCOUNT_TYPE.getName(), Short.valueOf(accountO.getType()).toString()));
- Domain domain = getManagementServer().findDomainIdById(accountO.getDomainId());
- accountData.add(new Pair(BaseCmd.Properties.DOMAIN_ID.getName(), Long.toString(domain.getId())));
- accountData.add(new Pair(BaseCmd.Properties.DOMAIN.getName(), domain.getName()));
-
- //get network stat
- List 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(BaseCmd.Properties.BYTES_RECEIVED.getName(), Long.valueOf(bytesReceived).toString()));
- accountData.add(new Pair(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(BaseCmd.Properties.VM_LIMIT.getName(), vmLimitDisplay));
- accountData.add(new Pair(BaseCmd.Properties.VM_TOTAL.getName(), vmTotal));
- accountData.add(new Pair(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(BaseCmd.Properties.IP_LIMIT.getName(), ipLimitDisplay));
- accountData.add(new Pair(BaseCmd.Properties.IP_TOTAL.getName(), ipTotal));
- accountData.add(new Pair(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(BaseCmd.Properties.VOLUME_LIMIT.getName(), volumeLimitDisplay));
- accountData.add(new Pair(BaseCmd.Properties.VOLUME_TOTAL.getName(), volumeTotal));
- accountData.add(new Pair(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(BaseCmd.Properties.SNAPSHOT_LIMIT.getName(), snapshotLimitDisplay));
- accountData.add(new Pair(BaseCmd.Properties.SNAPSHOT_TOTAL.getName(), snapshotTotal));
- accountData.add(new Pair(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(BaseCmd.Properties.TEMPLATE_LIMIT.getName(), templateLimitDisplay));
- accountData.add(new Pair(BaseCmd.Properties.TEMPLATE_TOTAL.getName(), templateTotal));
- accountData.add(new Pair(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(BaseCmd.Properties.VM_STOPPED.getName(), vmStopped));
- accountData.add(new Pair(BaseCmd.Properties.VM_RUNNING.getName(), vmRunning));
-
- //show this info to admins only
- if (isAdmin == true) {
- accountData.add(new Pair(BaseCmd.Properties.STATE.getName(), accountO.getState()));
- accountData.add(new Pair(BaseCmd.Properties.IS_CLEANUP_REQUIRED.getName(), Boolean.valueOf(accountO.getNeedsCleanup()).toString()));
- }
-
- aTag[i++] = accountData;
- }
- }
- Pair accountTag = new Pair("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> s_properties = new ArrayList>();
+
+ static {
+ s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.FALSE));
+ s_properties.add(new Pair(BaseCmd.Properties.NAME, Boolean.FALSE));
+ s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_TYPE, Boolean.FALSE));
+ s_properties.add(new Pair(BaseCmd.Properties.STATE, Boolean.FALSE));
+ s_properties.add(new Pair(BaseCmd.Properties.IS_CLEANUP_REQUIRED, Boolean.FALSE));
+ s_properties.add(new Pair(BaseCmd.Properties.KEYWORD, Boolean.FALSE));
+ s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT_OBJ, Boolean.FALSE));
+ s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE));
+ s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE));
+ s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE));
+ s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE));
+ }
+
+ public String getName() {
+ return s_name;
+ }
+ public List> getProperties() {
+ return s_properties;
+ }
+
+ @Override
+ public List> execute(Map 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 accounts = getManagementServer().searchForAccounts(c);
+
+ List> accountTags = new ArrayList>();
+ Object[] aTag = new Object[accounts.size()];
+ int i = 0;
+ for (AccountVO accountO : accounts) {
+ boolean accountIsAdmin = (accountO.getType() == Account.ACCOUNT_TYPE_ADMIN);
+
+ List> accountData = new ArrayList>();
+ accountData.add(new Pair(BaseCmd.Properties.ID.getName(), Long.valueOf(accountO.getId()).toString()));
+ accountData.add(new Pair(BaseCmd.Properties.NAME.getName(), accountO.getAccountName()));
+ accountData.add(new Pair(BaseCmd.Properties.ACCOUNT_TYPE.getName(), Short.valueOf(accountO.getType()).toString()));
+ Domain domain = getManagementServer().findDomainIdById(accountO.getDomainId());
+ accountData.add(new Pair(BaseCmd.Properties.DOMAIN_ID.getName(), Long.toString(domain.getId())));
+ accountData.add(new Pair(BaseCmd.Properties.DOMAIN.getName(), domain.getName()));
+
+ //get network stat
+ List 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(BaseCmd.Properties.BYTES_RECEIVED.getName(), Long.valueOf(bytesReceived).toString()));
+ accountData.add(new Pair(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(BaseCmd.Properties.VM_LIMIT.getName(), vmLimitDisplay));
+ accountData.add(new Pair(BaseCmd.Properties.VM_TOTAL.getName(), vmTotal));
+ accountData.add(new Pair(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(BaseCmd.Properties.IP_LIMIT.getName(), ipLimitDisplay));
+ accountData.add(new Pair(BaseCmd.Properties.IP_TOTAL.getName(), ipTotal));
+ accountData.add(new Pair(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(BaseCmd.Properties.VOLUME_LIMIT.getName(), volumeLimitDisplay));
+ accountData.add(new Pair(BaseCmd.Properties.VOLUME_TOTAL.getName(), volumeTotal));
+ accountData.add(new Pair(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(BaseCmd.Properties.SNAPSHOT_LIMIT.getName(), snapshotLimitDisplay));
+ accountData.add(new Pair(BaseCmd.Properties.SNAPSHOT_TOTAL.getName(), snapshotTotal));
+ accountData.add(new Pair(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(BaseCmd.Properties.TEMPLATE_LIMIT.getName(), templateLimitDisplay));
+ accountData.add(new Pair(BaseCmd.Properties.TEMPLATE_TOTAL.getName(), templateTotal));
+ accountData.add(new Pair(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(BaseCmd.Properties.VM_STOPPED.getName(), vmStopped));
+ accountData.add(new Pair(BaseCmd.Properties.VM_RUNNING.getName(), vmRunning));
+
+ //show this info to admins only
+ if (isAdmin == true) {
+ accountData.add(new Pair(BaseCmd.Properties.STATE.getName(), accountO.getState()));
+ accountData.add(new Pair(BaseCmd.Properties.IS_CLEANUP_REQUIRED.getName(), Boolean.valueOf(accountO.getNeedsCleanup()).toString()));
+ }
+
+ aTag[i++] = accountData;
+ }
+ Pair accountTag = new Pair("account", aTag);
+ accountTags.add(accountTag);
+ return accountTags;
+ }
+}
diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java
index c477a6d226e..290bd49f0b3 100644
--- a/server/src/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/com/cloud/server/ManagementServerImpl.java
@@ -4402,6 +4402,7 @@ public class ManagementServerImpl implements ManagementServer {
SearchBuilder 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) {
From 99c0c662a83eeec2b92a40bd6417363aa19faebc Mon Sep 17 00:00:00 2001
From: jessica
Date: Wed, 25 Aug 2010 18:01:59 -0700
Subject: [PATCH 019/235] Issue #: 5945 - replace index.html with index.jsp
---
ui/index.jsp | 173 +++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 173 insertions(+)
create mode 100755 ui/index.jsp
diff --git a/ui/index.jsp b/ui/index.jsp
new file mode 100755
index 00000000000..8be1f714663
--- /dev/null
+++ b/ui/index.jsp
@@ -0,0 +1,173 @@
+<%@ page import="java.util.Date" %>
+
+<%
+long milliseconds = new Date().getTime();
+%>
+
+
+
+
+
+
+
+
+
+
+ cloud.com - User Console
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Cloud.com CloudStack
+
+
+
Your session has expired. Please click 'OK' to return to the login screen.
-
-
-
-
-
From 73fb80e4248d4eb83958f1eacd411042bd9b0918 Mon Sep 17 00:00:00 2001
From: Kelven Yang
Date: Wed, 25 Aug 2010 18:46:14 -0700
Subject: [PATCH 021/235] Swich back to vmdk extention temporarily
---
api/src/com/cloud/storage/Storage.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/api/src/com/cloud/storage/Storage.java b/api/src/com/cloud/storage/Storage.java
index 7ebdc5e187e..a9273b2c132 100644
--- a/api/src/com/cloud/storage/Storage.java
+++ b/api/src/com/cloud/storage/Storage.java
@@ -23,7 +23,7 @@ public class Storage {
RAW(false, false, false),
VHD(true, true, true),
ISO(false, false, false),
- VMDK(true, true, true, ".tar.bz2");
+ VMDK(true, true, true);
private final boolean thinProvisioned;
private final boolean supportSparse;
From acb23b6158dc97d17bcb5dfda684fb778cdc0ba1 Mon Sep 17 00:00:00 2001
From: kishan
Date: Thu, 26 Aug 2010 14:53:03 +0530
Subject: [PATCH 022/235] bug 5904,5474: added listCapabilities API
---
client/tomcatconf/commands.properties.in | 3 +-
.../com/cloud/server/ManagementServer.java | 1 +
.../api/commands/ListCapabilitiesCmd.java | 58 +++++++++++++++++++
.../cloud/server/ManagementServerImpl.java | 20 +++++++
4 files changed, 81 insertions(+), 1 deletion(-)
create mode 100644 server/src/com/cloud/api/commands/ListCapabilitiesCmd.java
diff --git a/client/tomcatconf/commands.properties.in b/client/tomcatconf/commands.properties.in
index fb62d18615e..47f934cabd4 100644
--- a/client/tomcatconf/commands.properties.in
+++ b/client/tomcatconf/commands.properties.in
@@ -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
\ No newline at end of file
+listPreallocatedLuns=com.cloud.api.commands.ListPreallocatedLunsCmd;1
diff --git a/core/src/com/cloud/server/ManagementServer.java b/core/src/com/cloud/server/ManagementServer.java
index 840d9343ca6..85a3115ec07 100644
--- a/core/src/com/cloud/server/ManagementServer.java
+++ b/core/src/com/cloud/server/ManagementServer.java
@@ -2187,4 +2187,5 @@ public interface ManagementServer {
boolean checkIfMaintenable(long hostId);
+ Map listCapabilities();
}
diff --git a/server/src/com/cloud/api/commands/ListCapabilitiesCmd.java b/server/src/com/cloud/api/commands/ListCapabilitiesCmd.java
new file mode 100644
index 00000000000..2532f3673d5
--- /dev/null
+++ b/server/src/com/cloud/api/commands/ListCapabilitiesCmd.java
@@ -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 .
+ *
+ */
+
+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> s_properties = new ArrayList>();
+
+ public String getName() {
+ return s_name;
+ }
+ public List> getProperties() {
+ return s_properties;
+ }
+
+ @Override
+ public List> execute(Map params) {
+
+ Map capabilities = null;
+ capabilities = getManagementServer().listCapabilities();
+
+ Iterator iterator = capabilities.keySet().iterator();
+ List> capabilityPair = new ArrayList>();
+ while (iterator.hasNext()) {
+ String capability = iterator.next();
+ capabilityPair.add(new Pair(capability, capabilities.get(capability)));
+ }
+ return capabilityPair;
+ }
+}
diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java
index 290bd49f0b3..f83a482ac78 100644
--- a/server/src/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/com/cloud/server/ManagementServerImpl.java
@@ -8594,6 +8594,26 @@ public class ManagementServerImpl implements ManagementServer {
return false;
}
+ @Override
+ public Map listCapabilities() {
+ Map capabilities = new HashMap();
+
+ 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;
+ }
+
}
From fb99f95d7cb5c8dfa4219145d8d40ddbdcb1c013 Mon Sep 17 00:00:00 2001
From: kishan
Date: Thu, 26 Aug 2010 21:02:37 +0530
Subject: [PATCH 023/235] bug 5730: update dns of systemVms during zone update
---
client/tomcatconf/components.xml.in | 5 +-
core/src/com/cloud/vm/dao/VMInstanceDao.java | 1 +
.../com/cloud/vm/dao/VMInstanceDaoImpl.java | 15 ++++
.../ConfigurationManagerImpl.java | 79 +++++++++++++------
4 files changed, 75 insertions(+), 25 deletions(-)
diff --git a/client/tomcatconf/components.xml.in b/client/tomcatconf/components.xml.in
index ce698854bbe..9365e78ead9 100755
--- a/client/tomcatconf/components.xml.in
+++ b/client/tomcatconf/components.xml.in
@@ -215,8 +215,9 @@
-
-
+
+
+
diff --git a/core/src/com/cloud/vm/dao/VMInstanceDao.java b/core/src/com/cloud/vm/dao/VMInstanceDao.java
index 653445ad331..d496a80f4f3 100644
--- a/core/src/com/cloud/vm/dao/VMInstanceDao.java
+++ b/core/src/com/cloud/vm/dao/VMInstanceDao.java
@@ -80,4 +80,5 @@ public interface VMInstanceDao extends GenericDao {
List listByHostIdTypes(long hostid, VirtualMachine.Type... types);
List listUpByHostIdTypes(long hostid, VirtualMachine.Type... types);
+ List listByZoneIdAndType(long zoneId, VirtualMachine.Type type);
}
diff --git a/core/src/com/cloud/vm/dao/VMInstanceDaoImpl.java b/core/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
index 3ec6b2a12dc..d625db08bf7 100644
--- a/core/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
+++ b/core/src/com/cloud/vm/dao/VMInstanceDaoImpl.java
@@ -51,6 +51,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem
protected final SearchBuilder HostSearch;
protected final SearchBuilder LastHostSearch;
protected final SearchBuilder ZoneSearch;
+ protected final SearchBuilder ZoneVmTypeSearch;
protected final SearchBuilder ZoneTemplateNonExpungedSearch;
protected final SearchBuilder NameLikeSearch;
protected final SearchBuilder StateChangeSearch;
@@ -79,6 +80,11 @@ public class VMInstanceDaoImpl extends GenericDaoBase 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 implem
return listActiveBy(sc);
}
+ @Override
+ public List listByZoneIdAndType(long zoneId, VirtualMachine.Type type) {
+ SearchCriteria sc = ZoneVmTypeSearch.create();
+ sc.setParameters("zone", zoneId);
+ sc.setParameters("type", type.toString());
+ return listActiveBy(sc);
+ }
+
+
@Override
public List listNonExpungedByZoneAndTemplate(long zoneId, long templateId) {
SearchCriteria sc = ZoneTemplateNonExpungedSearch.create();
diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
index 047da0d1bef..9978cee29b1 100644
--- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
+++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
@@ -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 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 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 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 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;
From 0e2df1fe42b30e18c9ef1b6c653d84fb99dcb816 Mon Sep 17 00:00:00 2001
From: Kelven Yang
Date: Thu, 26 Aug 2010 09:43:37 -0700
Subject: [PATCH 024/235] Use dummy template package to speed up debug
---
api/src/com/cloud/storage/Storage.java | 2 +-
setup/db/templates.vmware.sql | 8 +++++---
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/api/src/com/cloud/storage/Storage.java b/api/src/com/cloud/storage/Storage.java
index a9273b2c132..81d94ad0331 100644
--- a/api/src/com/cloud/storage/Storage.java
+++ b/api/src/com/cloud/storage/Storage.java
@@ -23,7 +23,7 @@ public class Storage {
RAW(false, false, false),
VHD(true, true, true),
ISO(false, false, false),
- VMDK(true, true, true);
+ VMDK(true, true, true, "vmw.tar");
private final boolean thinProvisioned;
private final boolean supportSparse;
diff --git a/setup/db/templates.vmware.sql b/setup/db/templates.vmware.sql
index 572e42107a9..680fb06e0da 100644
--- a/setup/db/templates.vmware.sql
+++ b/setup/db/templates.vmware.sql
@@ -1,7 +1,9 @@
INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones)
- VALUES (1, 'routing', 'SystemVM Template', 0, now(), 'ext3', 0, 64, 1, 'http://nfs1.lab.vmops.com/templates/vmware/fedora11-x86.tar.bz2', '7957ff05cae838689eb53c7600b2fbe4', 0, 'SystemVM Template', 'VMDK', 47, 0, 1);
-INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones)
- VALUES (2, 'fedora11-x86', 'Fedora 11 x86', 1, now(), 'ext3', 0, 32, 1, 'http://nfs1.lab.vmops.com/templates/vmware/fedora11-x86.tar.bz2', '7957ff05cae838689eb53c7600b2fbe4', 0, 'Fedora 11 x86', 'VMDK', 47, 1, 1);
+ VALUES (1, 'routing', 'SystemVM Template', 0, now(), 'ext3', 0, 64, 1, 'http://nfs1.lab.vmops.com/templates/vmware/dummydomr.tar.bz2', '54c578d2c02759de4a9a8be7bd533df1', 0, 'SystemVM Template', 'VMDK', 47, 0, 1);
+
+--
+--INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones)
+-- VALUES (2, 'fedora11-x86', 'Fedora11-x86', 1, now(), 'ext3', 0, 32, 1, 'http://nfs1.lab.vmops.com/templates/vmware/fedora11-x86.tar.bz2', '7957ff05cae838689eb53c7600b2fbe4', 0, 'Fedora 11 x86', 'VMDK', 47, 1, 1);
INSERT INTO `cloud`.`guest_os_category` (id, name) VALUES (1, 'Windows');
INSERT INTO `cloud`.`guest_os_category` (id, name) VALUES (2, 'Linux');
From a3a503fecbf21b1e78a4afe77b0fe3f6a63fb01c Mon Sep 17 00:00:00 2001
From: Kelven Yang
Date: Thu, 26 Aug 2010 10:07:13 -0700
Subject: [PATCH 025/235] Use ImageFormat.getFileExtension instead of
toString() to retrieve template file extension name
---
core/src/com/cloud/storage/template/DownloadManagerImpl.java | 2 +-
core/src/com/cloud/storage/template/VmdkProcessor.java | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/core/src/com/cloud/storage/template/DownloadManagerImpl.java b/core/src/com/cloud/storage/template/DownloadManagerImpl.java
index 8d41e293e6a..3a69471fbb9 100644
--- a/core/src/com/cloud/storage/template/DownloadManagerImpl.java
+++ b/core/src/com/cloud/storage/template/DownloadManagerImpl.java
@@ -303,7 +303,7 @@ public class DownloadManagerImpl implements DownloadManager {
}
// add options common to ISO and template
- String extension = dnld.getFormat().toString().toLowerCase();
+ String extension = dnld.getFormat().getFileExtension();
String templateName = "";
if( extension.equals("iso")) {
templateName = jobs.get(jobId).getTmpltName().trim().replace(" ", "_");
diff --git a/core/src/com/cloud/storage/template/VmdkProcessor.java b/core/src/com/cloud/storage/template/VmdkProcessor.java
index fe060ab02de..d1e522196b1 100644
--- a/core/src/com/cloud/storage/template/VmdkProcessor.java
+++ b/core/src/com/cloud/storage/template/VmdkProcessor.java
@@ -26,7 +26,7 @@ public class VmdkProcessor implements Processor {
}
s_logger.info("Template processing. templatePath: " + templatePath + ", templateName: " + templateName);
- String templateFilePath = templatePath + File.separator + templateName + ImageFormat.VMDK.getFileExtension();
+ String templateFilePath = templatePath + File.separator + templateName + "." + ImageFormat.VMDK.getFileExtension();
if (!_storage.exists(templateFilePath)) {
if(s_logger.isInfoEnabled())
s_logger.info("Unable to find the vmware template file: " + templateFilePath);
@@ -35,7 +35,7 @@ public class VmdkProcessor implements Processor {
FormatInfo info = new FormatInfo();
info.format = ImageFormat.VMDK;
- info.filename = templateName + ImageFormat.VMDK.getFileExtension();
+ info.filename = templateName + "." + ImageFormat.VMDK.getFileExtension();
info.size = _storage.getSize(templateFilePath);
info.virtualSize = info.size;
return info;
From 43169f3f96192a4b5f4ac7837431e08367e6e42f Mon Sep 17 00:00:00 2001
From: kishan
Date: Thu, 26 Aug 2010 23:39:32 +0530
Subject: [PATCH 026/235] bug 5895: added config param to turn on/off md5 hash
---
server/src/com/cloud/configuration/Config.java | 1 +
1 file changed, 1 insertion(+)
diff --git a/server/src/com/cloud/configuration/Config.java b/server/src/com/cloud/configuration/Config.java
index d46e8f28211..c97749a6bc8 100644
--- a/server/src/com/cloud/configuration/Config.java
+++ b/server/src/com/cloud/configuration/Config.java
@@ -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),
From bbb307c82dd8472f28816c837b424f4153da4f59 Mon Sep 17 00:00:00 2001
From: Kelven Yang
Date: Thu, 26 Aug 2010 11:22:12 -0700
Subject: [PATCH 027/235] Explode vmware template file in place
---
core/src/com/cloud/storage/template/DownloadManagerImpl.java | 1 +
setup/db/templates.vmware.sql | 5 ++---
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/core/src/com/cloud/storage/template/DownloadManagerImpl.java b/core/src/com/cloud/storage/template/DownloadManagerImpl.java
index 3a69471fbb9..2d37f630fe3 100644
--- a/core/src/com/cloud/storage/template/DownloadManagerImpl.java
+++ b/core/src/com/cloud/storage/template/DownloadManagerImpl.java
@@ -353,6 +353,7 @@ public class DownloadManagerImpl implements DownloadManager {
try {
info = processor.process(templatePath, null, templateName);
} catch (InternalErrorException e) {
+ s_logger.error("Template process exception ", e);
return e.toString();
}
if (info != null) {
diff --git a/setup/db/templates.vmware.sql b/setup/db/templates.vmware.sql
index 680fb06e0da..53080bc6277 100644
--- a/setup/db/templates.vmware.sql
+++ b/setup/db/templates.vmware.sql
@@ -1,9 +1,8 @@
INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones)
VALUES (1, 'routing', 'SystemVM Template', 0, now(), 'ext3', 0, 64, 1, 'http://nfs1.lab.vmops.com/templates/vmware/dummydomr.tar.bz2', '54c578d2c02759de4a9a8be7bd533df1', 0, 'SystemVM Template', 'VMDK', 47, 0, 1);
---
---INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones)
--- VALUES (2, 'fedora11-x86', 'Fedora11-x86', 1, now(), 'ext3', 0, 32, 1, 'http://nfs1.lab.vmops.com/templates/vmware/fedora11-x86.tar.bz2', '7957ff05cae838689eb53c7600b2fbe4', 0, 'Fedora 11 x86', 'VMDK', 47, 1, 1);
+INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones)
+ VALUES (2, 'fedora11-x86', 'Fedora11-x86', 1, now(), 'ext3', 0, 32, 1, 'http://nfs1.lab.vmops.com/templates/vmware/fedora11-x86.tar.bz2', '7957ff05cae838689eb53c7600b2fbe4', 0, 'Fedora 11 x86', 'VMDK', 47, 1, 1);
INSERT INTO `cloud`.`guest_os_category` (id, name) VALUES (1, 'Windows');
INSERT INTO `cloud`.`guest_os_category` (id, name) VALUES (2, 'Linux');
From 01508aa6b341c4493706d4a97ca3a0ea9f921e2f Mon Sep 17 00:00:00 2001
From: jessica
Date: Thu, 26 Aug 2010 11:51:33 -0700
Subject: [PATCH 028/235] Issue #: 5945 - replace all content/tab_xxxxxxx.html
with jsp/tab_xxxxxxx.jsp
---
.../tab_accounts.jsp} | 6 +++++-
.../tab_configuration.jsp} | 6 +++++-
.../tab_dashboard.jsp} | 0
ui/jsp/tab_domains.jsp | 7 +++++--
.../tab_events.html => jsp/tab_events.jsp} | 6 +++++-
.../tab_hosts.html => jsp/tab_hosts.jsp} | 6 +++++-
.../tab_instances.jsp} | 6 +++++-
.../tab_networking.jsp} | 6 +++++-
.../tab_storage.html => jsp/tab_storage.jsp} | 6 +++++-
.../tab_templates.jsp} | 6 +++++-
ui/scripts/cloud.core.domains.js | 6 +++---
ui/scripts/cloud.core.init.js | 20 +++++++++----------
12 files changed, 58 insertions(+), 23 deletions(-)
rename ui/{content/tab_accounts.html => jsp/tab_accounts.jsp} (98%)
mode change 100644 => 100755
rename ui/{content/tab_configuration.html => jsp/tab_configuration.jsp} (99%)
mode change 100644 => 100755
rename ui/{content/tab_dashboard.html => jsp/tab_dashboard.jsp} (100%)
mode change 100644 => 100755
mode change 100644 => 100755 ui/jsp/tab_domains.jsp
rename ui/{content/tab_events.html => jsp/tab_events.jsp} (98%)
mode change 100644 => 100755
rename ui/{content/tab_hosts.html => jsp/tab_hosts.jsp} (98%)
mode change 100644 => 100755
rename ui/{content/tab_instances.html => jsp/tab_instances.jsp} (99%)
mode change 100644 => 100755
rename ui/{content/tab_networking.html => jsp/tab_networking.jsp} (99%)
mode change 100644 => 100755
rename ui/{content/tab_storage.html => jsp/tab_storage.jsp} (99%)
mode change 100644 => 100755
rename ui/{content/tab_templates.html => jsp/tab_templates.jsp} (99%)
mode change 100644 => 100755
diff --git a/ui/content/tab_accounts.html b/ui/jsp/tab_accounts.jsp
old mode 100644
new mode 100755
similarity index 98%
rename from ui/content/tab_accounts.html
rename to ui/jsp/tab_accounts.jsp
index 5a63bb419c5..df4da1544c5
--- a/ui/content/tab_accounts.html
+++ b/ui/jsp/tab_accounts.jsp
@@ -1,4 +1,8 @@
-
+<%@ page import="java.util.Date" %>
+<%
+long milliseconds = new Date().getTime();
+%>
+
diff --git a/ui/content/tab_configuration.html b/ui/jsp/tab_configuration.jsp
old mode 100644
new mode 100755
similarity index 99%
rename from ui/content/tab_configuration.html
rename to ui/jsp/tab_configuration.jsp
index 9bdbd581bb9..163c056effc
--- a/ui/content/tab_configuration.html
+++ b/ui/jsp/tab_configuration.jsp
@@ -1,4 +1,8 @@
-
+<%@ page import="java.util.Date" %>
+<%
+long milliseconds = new Date().getTime();
+%>
+
diff --git a/ui/content/tab_dashboard.html b/ui/jsp/tab_dashboard.jsp
old mode 100644
new mode 100755
similarity index 100%
rename from ui/content/tab_dashboard.html
rename to ui/jsp/tab_dashboard.jsp
diff --git a/ui/jsp/tab_domains.jsp b/ui/jsp/tab_domains.jsp
old mode 100644
new mode 100755
index 1d258ca1b48..dbe56fb321d
--- a/ui/jsp/tab_domains.jsp
+++ b/ui/jsp/tab_domains.jsp
@@ -1,5 +1,8 @@
-
-
+<%@ page import="java.util.Date" %>
+<%
+long milliseconds = new Date().getTime();
+%>
+
diff --git a/ui/content/tab_events.html b/ui/jsp/tab_events.jsp
old mode 100644
new mode 100755
similarity index 98%
rename from ui/content/tab_events.html
rename to ui/jsp/tab_events.jsp
index 2ffd07662eb..f5c4ac48e88
--- a/ui/content/tab_events.html
+++ b/ui/jsp/tab_events.jsp
@@ -1,4 +1,8 @@
-
+<%@ page import="java.util.Date" %>
+<%
+long milliseconds = new Date().getTime();
+%>
+
diff --git a/ui/content/tab_hosts.html b/ui/jsp/tab_hosts.jsp
old mode 100644
new mode 100755
similarity index 98%
rename from ui/content/tab_hosts.html
rename to ui/jsp/tab_hosts.jsp
index 6d4cf09ab66..438efabae1e
--- a/ui/content/tab_hosts.html
+++ b/ui/jsp/tab_hosts.jsp
@@ -1,4 +1,8 @@
-
+<%@ page import="java.util.Date" %>
+<%
+long milliseconds = new Date().getTime();
+%>
+
diff --git a/ui/content/tab_instances.html b/ui/jsp/tab_instances.jsp
old mode 100644
new mode 100755
similarity index 99%
rename from ui/content/tab_instances.html
rename to ui/jsp/tab_instances.jsp
index 55991f3ff01..856ca9189c8
--- a/ui/content/tab_instances.html
+++ b/ui/jsp/tab_instances.jsp
@@ -1,4 +1,8 @@
-
+<%@ page import="java.util.Date" %>
+<%
+long milliseconds = new Date().getTime();
+%>
+
diff --git a/ui/content/tab_networking.html b/ui/jsp/tab_networking.jsp
old mode 100644
new mode 100755
similarity index 99%
rename from ui/content/tab_networking.html
rename to ui/jsp/tab_networking.jsp
index e78b41eb636..98a76bd3423
--- a/ui/content/tab_networking.html
+++ b/ui/jsp/tab_networking.jsp
@@ -1,4 +1,8 @@
-
+<%@ page import="java.util.Date" %>
+<%
+long milliseconds = new Date().getTime();
+%>
+
diff --git a/ui/content/tab_storage.html b/ui/jsp/tab_storage.jsp
old mode 100644
new mode 100755
similarity index 99%
rename from ui/content/tab_storage.html
rename to ui/jsp/tab_storage.jsp
index 3abfa48568f..92f6b5ae5fb
--- a/ui/content/tab_storage.html
+++ b/ui/jsp/tab_storage.jsp
@@ -1,4 +1,8 @@
-
+<%@ page import="java.util.Date" %>
+<%
+long milliseconds = new Date().getTime();
+%>
+
diff --git a/ui/content/tab_templates.html b/ui/jsp/tab_templates.jsp
old mode 100644
new mode 100755
similarity index 99%
rename from ui/content/tab_templates.html
rename to ui/jsp/tab_templates.jsp
index 3438c971de2..db678162dbd
--- a/ui/content/tab_templates.html
+++ b/ui/jsp/tab_templates.jsp
@@ -1,4 +1,8 @@
-
+<%@ page import="java.util.Date" %>
+<%
+long milliseconds = new Date().getTime();
+%>
+
Template
diff --git a/ui/scripts/cloud.core.domains.js b/ui/scripts/cloud.core.domains.js
index db94223d8f1..572ebe8dbad 100644
--- a/ui/scripts/cloud.core.domains.js
+++ b/ui/scripts/cloud.core.domains.js
@@ -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) {
diff --git a/ui/scripts/cloud.core.init.js b/ui/scripts/cloud.core.init.js
index a6d0035e164..ffc2e3bfa3c 100644
--- a/ui/scripts/cloud.core.init.js
+++ b/ui/scripts/cloud.core.init.js
@@ -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()) {
From b91c910a94363e1f96788fe7e8655ab7ca4ccdae Mon Sep 17 00:00:00 2001
From: Kelven Yang
Date: Thu, 26 Aug 2010 13:35:46 -0700
Subject: [PATCH 029/235] Test & Debug register template on vmware
---
utils/src/com/cloud/utils/DateUtil.java | 11 -----------
1 file changed, 11 deletions(-)
diff --git a/utils/src/com/cloud/utils/DateUtil.java b/utils/src/com/cloud/utils/DateUtil.java
index c6659a7cfe1..d9bbad4592b 100644
--- a/utils/src/com/cloud/utils/DateUtil.java
+++ b/utils/src/com/cloud/utils/DateUtil.java
@@ -242,16 +242,6 @@ public class DateUtil {
// test only
public static void main(String[] args) {
- try {
- URI uri = new URI("nfs://192.168.10.231/export/home/kelven/vmware-test/secondary");
- System.out.println("protocol: " + uri.getScheme());
- System.out.println("Host: " + uri.getHost());
- System.out.println("path: " + uri.getPath());
- System.out.println("port: " + uri.getPort());
- } catch(Exception e) {
- }
-
-/*
TimeZone localTimezone = Calendar.getInstance().getTimeZone();
TimeZone gmtTimezone = TimeZone.getTimeZone("GMT");
TimeZone estTimezone = TimeZone.getTimeZone("EST");
@@ -274,7 +264,6 @@ public class DateUtil {
System.out.println("Parsed TZ time string : "+ dtParsed.toString());
} catch (ParseException e) {
}
-*/
}
}
From 3565f8d21b331745b99ce3a09a35d642f2f7bcfe Mon Sep 17 00:00:00 2001
From: root
Date: Thu, 26 Aug 2010 15:56:02 -0700
Subject: [PATCH 030/235] use iso to patch systemvm
Conflicts:
core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
scripts/vm/hypervisor/xenserver/xenserver56/patch
---
build/build-cloud.xml | 29 ++++-
build/developer.xml | 3 +-
build/package.xml | 16 ++-
client/tomcatconf/components.xml.in | 4 +-
.../xen/resource/CitrixResourceBase.java | 83 ++++++------
patches/xenserver/etc/sysconfig/iptables-domr | 24 ++++
patches/xenserver/root/.ssh/authorized_keys | 1 +
patches/xenserver/root/patchsystemvm.sh | 121 ++++++++++++++++++
scripts/vm/hypervisor/xenserver/id_rsa.cloud | 27 ++++
.../vm/hypervisor/xenserver/xenserver56/patch | 7 +-
.../src/com/cloud/alert/AlertManagerImpl.java | 3 +-
.../xen/discoverer/XcpServerDiscoverer.java | 7 +-
12 files changed, 274 insertions(+), 51 deletions(-)
create mode 100644 patches/xenserver/etc/sysconfig/iptables-domr
create mode 100644 patches/xenserver/root/.ssh/authorized_keys
create mode 100755 patches/xenserver/root/patchsystemvm.sh
create mode 100644 scripts/vm/hypervisor/xenserver/id_rsa.cloud
diff --git a/build/build-cloud.xml b/build/build-cloud.xml
index db9e5a7c5af..4d52d08bb01 100755
--- a/build/build-cloud.xml
+++ b/build/build-cloud.xml
@@ -107,6 +107,10 @@
+
+
+
+
@@ -519,7 +523,8 @@
-
+
+
@@ -531,8 +536,26 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/build/developer.xml b/build/developer.xml
index 77d760b2af7..33d77a6c85a 100755
--- a/build/developer.xml
+++ b/build/developer.xml
@@ -100,7 +100,7 @@
-
+
@@ -114,7 +114,6 @@
-
diff --git a/build/package.xml b/build/package.xml
index 82781c61a2f..fce58ddcd5e 100755
--- a/build/package.xml
+++ b/build/package.xml
@@ -94,7 +94,7 @@
-
+
@@ -103,6 +103,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
@@ -123,7 +135,7 @@
-
+
diff --git a/client/tomcatconf/components.xml.in b/client/tomcatconf/components.xml.in
index ce698854bbe..91141cff203 100755
--- a/client/tomcatconf/components.xml.in
+++ b/client/tomcatconf/components.xml.in
@@ -110,7 +110,9 @@
-
+
+
+
diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
index d88b50528cd..cf552dabc4c 100644
--- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
+++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
@@ -152,6 +152,7 @@ import com.cloud.host.Host.Type;
import com.cloud.hypervisor.Hypervisor;
import com.cloud.network.Network.BroadcastDomainType;
import com.cloud.network.Network.TrafficType;
+import com.cloud.hypervisor.xen.resource.XenServerConnectionPool.XenServerConnection;
import com.cloud.resource.ServerResource;
import com.cloud.storage.Storage;
import com.cloud.storage.Storage.ImageFormat;
@@ -1063,29 +1064,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
}
protected Answer execute(ModifySshKeysCommand cmd) {
- String publickey = cmd.getPubKey();
- String privatekey = cmd.getPrvKey();
-
- com.trilead.ssh2.Connection sshConnection = new com.trilead.ssh2.Connection(_host.ip, 22);
- try {
- sshConnection.connect(null, 60000, 60000);
- if (!sshConnection.authenticateWithPassword(_username, _password)) {
- throw new Exception("Unable to authenticate");
- }
- SCPClient scp = new SCPClient(sshConnection);
-
- scp.put(publickey.getBytes(), "id_rsa.pub", "/opt/xensource/bin", "0600");
- scp.put(privatekey.getBytes(), "id_rsa", "/opt/xensource/bin", "0600");
- scp.put(privatekey.getBytes(), "id_rsa.cloud", "/root/.ssh", "0600");
- return new Answer(cmd);
-
- } catch (Exception e) {
- String msg = " scp ssh key failed due to " + e.toString() + " - " + e.getMessage();
- s_logger.warn(msg);
- } finally {
- sshConnection.close();
- }
- return new Answer(cmd, false, "modifySshkeys failed");
+ return new Answer(cmd);
}
private boolean doPingTest(final String computingHostIp) {
@@ -3187,13 +3166,6 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
Ternary mount = mounts.get(0);
- if (!patchSystemVm(mount.second(), vmName)) { // FIXME make this
- // nonspecific
- String msg = "patch system vm failed";
- s_logger.warn(msg);
- return msg;
- }
-
Set templates = VM.getByNameLabel(conn, "CentOS 5.3");
if (templates.size() == 0) {
templates = VM.getByNameLabel(conn, "CentOS 5.3 (64-bit)");
@@ -3232,6 +3204,17 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
vbdr.type = Types.VbdType.DISK;
VBD.create(conn, vbdr);
+
+ /* create CD-ROM VBD */
+ VBD.Record cdromVBDR = new VBD.Record();
+ cdromVBDR.VM = vm;
+ cdromVBDR.empty = true;
+ cdromVBDR.bootable = false;
+ cdromVBDR.userdevice = "3";
+ cdromVBDR.mode = Types.VbdMode.RO;
+ cdromVBDR.type = Types.VbdType.CD;
+ VBD cdromVBD = VBD.create(conn, cdromVBDR);
+ cdromVBD.insert(conn, VDI.getByUuid(conn, _host.systemvmisouuid));
/* create VIF0 */
VIF.Record vifr = new VIF.Record();
@@ -3508,8 +3491,6 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
s_logger.debug("Slave logon successful. session= " + slaveSession);
}
Host host = Host.getByUuid(slaveConn, _host.uuid);
-
-
for (int i = 0; i < params.length; i += 2) {
args.put(params[i], params[i + 1]);
}
@@ -4013,7 +3994,38 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
try {
Host myself = Host.getByUuid(conn, _host.uuid);
_host.pool = getPoolUuid();
+
+ boolean findsystemvmiso = false;
+ Set srs = SR.getByNameLabel(conn, "XenServer Tools");
+ if( srs.size() != 1 ) {
+ throw new CloudRuntimeException("There are " + srs.size() + " SRs with name XenServer Tools");
+ }
+ SR sr = srs.iterator().next();
+ sr.scan(conn);
+ SR.Record srr = sr.getRecord(conn);
+ _host.systemvmisouuid = null;
+ for( VDI vdi : srr.VDIs ) {
+ VDI.Record vdir = vdi.getRecord(conn);
+ if(vdir.nameLabel.contains("systemvm-premium")){
+ _host.systemvmisouuid = vdir.uuid;
+ break;
+ }
+ }
+ if( _host.systemvmisouuid == null ) {
+ for( VDI vdi : srr.VDIs ) {
+ VDI.Record vdir = vdi.getRecord(conn);
+ if(vdir.nameLabel.contains("systemvm")){
+ _host.systemvmisouuid = vdir.uuid;
+ break;
+ }
+ }
+ }
+
+ if( _host.systemvmisouuid == null ) {
+ throw new CloudRuntimeException("can not find systemvmiso");
+ }
+
String name = "cloud-private";
if (_privateNetworkName != null) {
name = _privateNetworkName;
@@ -4344,17 +4356,13 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
scp.put(f, d, p);
}
+
} catch (IOException e) {
throw new CloudRuntimeException("Unable to setup the server correctly", e);
} finally {
sshConnection.close();
}
- try {
- // wait 2 seconds before call plugin
- Thread.sleep(2000);
- } catch (final InterruptedException ex) {
- }
if (!setIptables()) {
s_logger.warn("set xenserver Iptable failed");
}
@@ -6639,6 +6647,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
// the resource first connects to XenServer. These UUIDs do
// not change over time.
protected class XenServerHost {
+ public String systemvmisouuid;
public String uuid;
public String ip;
public String publicNetwork;
diff --git a/patches/xenserver/etc/sysconfig/iptables-domr b/patches/xenserver/etc/sysconfig/iptables-domr
new file mode 100644
index 00000000000..3bc7b50f74a
--- /dev/null
+++ b/patches/xenserver/etc/sysconfig/iptables-domr
@@ -0,0 +1,24 @@
+*nat
+:PREROUTING ACCEPT [0:0]
+:POSTROUTING ACCEPT [0:0]
+:OUTPUT ACCEPT [0:0]
+COMMIT
+*filter
+:INPUT DROP [0:0]
+:FORWARD DROP [0:0]
+:OUTPUT ACCEPT [0:0]
+-A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
+-A INPUT -i eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
+-A INPUT -i eth2 -m state --state RELATED,ESTABLISHED -j ACCEPT
+-A INPUT -p icmp -j ACCEPT
+-A INPUT -i lo -j ACCEPT
+-A INPUT -i eth0 -p udp -m udp --dport 67 -j ACCEPT
+-A INPUT -i eth0 -p udp -m udp --dport 53 -j ACCEPT
+-A INPUT -i eth1 -p tcp -m state --state NEW --dport 3922 -j ACCEPT
+-A INPUT -i eth0 -p tcp -m state --state NEW --dport 8080 -j ACCEPT
+-A INPUT -i eth0 -p tcp -m state --state NEW --dport 80 -j ACCEPT
+-A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
+-A FORWARD -i eth0 -o eth2 -j ACCEPT
+-A FORWARD -i eth2 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
+COMMIT
+
diff --git a/patches/xenserver/root/.ssh/authorized_keys b/patches/xenserver/root/.ssh/authorized_keys
new file mode 100644
index 00000000000..2cb275c2582
--- /dev/null
+++ b/patches/xenserver/root/.ssh/authorized_keys
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA3VD1tGRDn3stlJvPNXmQZdQCNjqcfY+xlitd5q0n3KYqJ5OBrty3/00XBUdLt31TbQ4dv+GR7uEr+ex7rm0jjmTFKV4rHYPi882CuC5+bkBp5R4k+mpcyKbxb+IoNS9ItbiExQxMiiRQpHvNem0GGnNFO3lElRPwUFs8evTvZu5HcTj4k4RJLJ66jeIGJ3sMAJ03SICGwfEZjrsyeOMwJk7cH8WNeuNzxzoZd9v02eI0lHdK9O5z7FwrxvRBbzsmJ0EwuhbH8pR7WR6kGLTNP9KEwtrnzV1LYWd+rFoSeh6ImExG7fma3Ldydg8CPTQsjvCEQUxiuV1/x5am5VJlUw== root@r-6-TEST
diff --git a/patches/xenserver/root/patchsystemvm.sh b/patches/xenserver/root/patchsystemvm.sh
new file mode 100755
index 00000000000..f878ea11aa8
--- /dev/null
+++ b/patches/xenserver/root/patchsystemvm.sh
@@ -0,0 +1,121 @@
+#/bin/bash
+# $Id: patchsystemvm.sh 10800 2010-07-16 13:48:39Z edison $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x/java/scripts/vm/hypervisor/xenserver/prepsystemvm.sh $
+
+#set -x
+logfile="/var/log/patchsystemvm.log"
+#
+# To use existing console proxy .zip-based package file
+#
+patch_console_proxy() {
+ local patchfile=$1
+ rm /usr/local/cloud/systemvm -rf
+ mkdir -p /usr/local/cloud/systemvm
+ echo "All" | unzip $patchfile -d /usr/local/cloud/systemvm >$logfile 2>&1
+ find /usr/local/cloud/systemvm/ -name \*.sh | xargs chmod 555
+ return 0
+}
+
+consoleproxy_svcs() {
+ chkconfig cloud on
+ chkconfig postinit on
+ chkconfig domr_webserver off
+ chkconfig haproxy off ;
+ chkconfig dnsmasq off
+ chkconfig sshd on
+ chkconfig httpd off
+ chkconfig nfs off
+ chkconfig nfslock off
+ chkconfig rpcbind off
+ chkconfig rpcidmap off
+ cp /etc/sysconfig/iptables-consoleproxy /etc/sysconfig/iptables
+ mkdir -p /var/log/cloud
+}
+
+secstorage_svcs() {
+ chkconfig cloud on
+ chkconfig postinit on
+ chkconfig domr_webserver off
+ chkconfig haproxy off ;
+ chkconfig dnsmasq off
+ chkconfig sshd on
+ chkconfig httpd off
+ cp /etc/sysconfig/iptables-secstorage /etc/sysconfig/iptables
+ mkdir -p /var/log/cloud
+}
+
+routing_svcs() {
+ chkconfig cloud off
+ chkconfig domr_webserver on ;
+ chkconfig haproxy on ;
+ chkconfig dnsmasq on
+ chkconfig sshd on
+ chkconfig nfs off
+ chkconfig nfslock off
+ chkconfig rpcbind off
+ chkconfig rpcidmap off
+ cp /etc/sysconfig/iptables-domr /etc/sysconfig/iptables
+}
+
+CMDLINE=$(cat /proc/cmdline)
+TYPE="router"
+
+for i in $CMDLINE
+ do
+ # search for foo=bar pattern and cut out foo
+ KEY=$(echo $i | cut -d= -f1)
+ VALUE=$(echo $i | cut -d= -f2)
+ case $KEY in
+ type)
+ TYPE=$VALUE
+ ;;
+ *)
+ ;;
+ esac
+done
+
+if [ "$TYPE" == "consoleproxy" ] || [ "$TYPE" == "secstorage" ] && [ -f /media/cdrom/systemvm.zip ]
+then
+ patch_console_proxy /media/cdrom/systemvm.zip
+ if [ $? -gt 0 ]
+ then
+ printf "Failed to apply patch systemvm\n" >$logfile
+ exit 5
+ fi
+fi
+
+
+#empty known hosts
+echo "" > /root/.ssh/known_hosts
+
+if [ "$TYPE" == "router" ]
+then
+ routing_svcs
+ if [ $? -gt 0 ]
+ then
+ printf "Failed to execute routing_svcs\n" >$logfile
+ exit 6
+ fi
+fi
+
+
+if [ "$TYPE" == "consoleproxy" ]
+then
+ consoleproxy_svcs
+ if [ $? -gt 0 ]
+ then
+ printf "Failed to execute consoleproxy_svcs\n" >$logfile
+ exit 7
+ fi
+fi
+
+if [ "$TYPE" == "secstorage" ]
+then
+ secstorage_svcs
+ if [ $? -gt 0 ]
+ then
+ printf "Failed to execute secstorage_svcs\n" >$logfile
+ exit 8
+ fi
+fi
+
+exit $?
diff --git a/scripts/vm/hypervisor/xenserver/id_rsa.cloud b/scripts/vm/hypervisor/xenserver/id_rsa.cloud
new file mode 100644
index 00000000000..ea46a3cebb6
--- /dev/null
+++ b/scripts/vm/hypervisor/xenserver/id_rsa.cloud
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEogIBAAKCAQEA3VD1tGRDn3stlJvPNXmQZdQCNjqcfY+xlitd5q0n3KYqJ5OB
+rty3/00XBUdLt31TbQ4dv+GR7uEr+ex7rm0jjmTFKV4rHYPi882CuC5+bkBp5R4k
++mpcyKbxb+IoNS9ItbiExQxMiiRQpHvNem0GGnNFO3lElRPwUFs8evTvZu5HcTj4
+k4RJLJ66jeIGJ3sMAJ03SICGwfEZjrsyeOMwJk7cH8WNeuNzxzoZd9v02eI0lHdK
+9O5z7FwrxvRBbzsmJ0EwuhbH8pR7WR6kGLTNP9KEwtrnzV1LYWd+rFoSeh6ImExG
+7fma3Ldydg8CPTQsjvCEQUxiuV1/x5am5VJlUwIBIwKCAQEA0KtrUk/n/MSYsLAp
+xLRyNB+qUGMl1Xjao4f5cxhKJ8/emlfgrC8xI+mZXL+QiG7ZoVZz0ixzprcMNMkG
+5kmlLnxE3dxxy18Xz+2nIq9+hTVrKHuB82uZT3jVAxcP96GcU5C3snlPeu8KNK8+
+FFgqU3P/cpbo5FSgwMsNI3k5fkyffYtmBdtjZhWXJqnA9+bMdCmYEKyQFWp18LvV
+pjGx1jLFZTx9+aDz7gdIk21zbVXmwQmnS1fVKJEByTMvokpvdJUvDedvpgqGqX/g
+IXkTXe49pYhYwxVguLK6FXyQBwOuUsnur2A79T3wBvzEMozkYLkEG/zcw0fyo3iC
+fdzc6wKBgQD2gq+kUc2r/+xE+smIej2ICvFZZlSh1ko2tVmVUHuuuMCuBt054Dq9
+mf8/yIbXSvVtuBMJ+jewVnKfhucEQKf6E1jBdQShezlomFLOQ8cFQJhT6tAwJl/k
+TR+OjeTuOcBknkE8nstNt7hAkZxY6h/Lu54OM9AkXyZ9skx7gHh+IwKBgQDl1f09
+YkoM9rqXM8lMKjF0z81T4ACCaFUA6ZKjSZelyG+azJDlRFNWX1In3Kq6aInpZPzs
+owwIS9tjkXIaLR1wDJ+K8IGJQ19sqCzv3/kBCDXA6mqXkkPR80xRi4wuZ3lETOdL
+OBXPffuQaKxk32esqsxK6As1LgH4+048JS23EQKBgQCpCSf7pc7cV7f0yTm8q5fo
+QgSVEvg0da87dQo6gFTPlKFhY8rl25X+WvgrvLQ726D6x12DLzwhJVXpu5cY2+Dl
+/qNC0+XrEqsF5MsRGIh4oVKCr6SzTYOVPDLlaJz7IElpkRbKe4QYCPNfecpLmTpf
+0Rvse0zlvZa8l4Tm+QIqmwKBgBOzQZeMFPnMAV1q1r1is8gvEZl5maTHHTqXrXu1
+2cxhoyqGkBOmxVCL09eH8WBvXEc0irUyjAC2C32QH7kZz1K/QOAF/Hl6zao6TP6e
+K0k7N861AdJ6QFPTBoqlj6w0wUBeXPfRm3gvXrSbQfoEhTqvjdqI6wSO6jnpp57B
+W7CbAoGABFHMVXEyT3SliMSRtiCuDOrtl9E/aiOByPulXolqth5WDSel31Lz+iY7
+ldOLNQO/oononTStdd0fDGChl3WXBSOToJJ/HjIWH05bDY9n2EDAyZvmaW9rX3JQ
+pH9c/1vlD9lxDEBvq4JXmTtdL0Ho00F5vVHnWnwINtfx6c5BIjg=
+-----END RSA PRIVATE KEY-----
diff --git a/scripts/vm/hypervisor/xenserver/xenserver56/patch b/scripts/vm/hypervisor/xenserver/xenserver56/patch
index 15b8908ddb5..14b4039c5a2 100644
--- a/scripts/vm/hypervisor/xenserver/xenserver56/patch
+++ b/scripts/vm/hypervisor/xenserver/xenserver56/patch
@@ -18,9 +18,12 @@ nfs.py=/opt/xensource/sm
patch.tgz=..,0775,/opt/xensource/bin
vmops=..,0755,/etc/xapi.d/plugins
vmopsSnapshot=..,0755,/etc/xapi.d/plugins
-systemvm-premium.zip=../../../../../vms,0755,/opt/xensource/bin
-hostvmstats.py=..,0755,/opt/xensource/sm
xs_cleanup.sh=..,0755,/opt/xensource/bin
+systemvm-premium.iso=../../../../../vms,0644,/opt/xensource/packages/iso
+systemvm.iso=../../../../../vms,0644,/opt/xensource/packages/iso
+hostvmstats.py=..,0755,/opt/xensource/sm
+id_rsa.cloud=..,0600,/opt/xensource/bin
+id_rsa.cloud=..,0600,/root/.ssh
network_info.sh=..,0755,/opt/xensource/bin
prepsystemvm.sh=..,0755,/opt/xensource/bin
setupxenserver.sh=..,0755,/opt/xensource/bin
diff --git a/server/src/com/cloud/alert/AlertManagerImpl.java b/server/src/com/cloud/alert/AlertManagerImpl.java
index 378bc5dc699..033b1ba3282 100644
--- a/server/src/com/cloud/alert/AlertManagerImpl.java
+++ b/server/src/com/cloud/alert/AlertManagerImpl.java
@@ -153,7 +153,8 @@ public class AlertManagerImpl implements AlertManager {
smtpDebug = Boolean.parseBoolean(smtpDebugStr);
}
- _emailAlert = new EmailAlert(emailAddresses, smtpHost, smtpPort, useAuth, smtpUsername, smtpPassword, emailSender, smtpDebug);
+ _emailAlert = new EmailAlert(emailAddresses, smtpHost, smtpPort, useAuth, smtpUsername, smtpPassword, emailSender, smtpDebug);
+ _emailAlert = null;
String storageCapacityThreshold = configs.get("storage.capacity.threshold");
String cpuCapacityThreshold = configs.get("cpu.capacity.threshold");
diff --git a/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java b/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java
index 049d9a70923..e7dc2a20fbb 100644
--- a/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java
+++ b/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java
@@ -52,6 +52,7 @@ import com.cloud.host.Status;
import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.xen.resource.CitrixResourceBase;
import com.cloud.hypervisor.xen.resource.XcpServerResource;
+import com.cloud.hypervisor.xen.resource.XenServerResource;
import com.cloud.hypervisor.xen.resource.XenServerConnectionPool;
import com.cloud.resource.Discoverer;
import com.cloud.resource.DiscovererBase;
@@ -382,10 +383,10 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L
if(prodBrand.equals("XenCloudPlatform") && prodVersion.equals("0.1.1"))
return new XcpServerResource();
-// if(prodBrand.equals("XenServer") && prodVersion.equals("5.6.0"))
-// return new XenServerResource();
+ if(prodBrand.equals("XenServer") && prodVersion.equals("5.6.0"))
+ return new XenServerResource();
- String msg = "Only support XCP 0.1.1 and Xerver 5.6.0, but this one is " + prodBrand + " " + prodVersion;
+ String msg = "Only support XCP 0.1.1 and XenServer 5.6.0, but this one is " + prodBrand + " " + prodVersion;
_alertMgr.sendAlert(AlertManager.ALERT_TYPE_HOST, dcId, podId, msg, msg);
s_logger.debug(msg);
throw new RuntimeException(msg);
From 145e2e0aaa9b57286102664787e8e40ad3d75e26 Mon Sep 17 00:00:00 2001
From: Anthony Xu
Date: Thu, 26 Aug 2010 16:03:34 -0700
Subject: [PATCH 031/235] Revert "use iso to patch systemvm"
This reverts commit 3565f8d21b331745b99ce3a09a35d642f2f7bcfe.
---
build/build-cloud.xml | 29 +----
build/developer.xml | 3 +-
build/package.xml | 16 +--
client/tomcatconf/components.xml.in | 4 +-
.../xen/resource/CitrixResourceBase.java | 83 ++++++------
patches/xenserver/etc/sysconfig/iptables-domr | 24 ----
patches/xenserver/root/.ssh/authorized_keys | 1 -
patches/xenserver/root/patchsystemvm.sh | 121 ------------------
scripts/vm/hypervisor/xenserver/id_rsa.cloud | 27 ----
.../vm/hypervisor/xenserver/xenserver56/patch | 7 +-
.../src/com/cloud/alert/AlertManagerImpl.java | 3 +-
.../xen/discoverer/XcpServerDiscoverer.java | 7 +-
12 files changed, 51 insertions(+), 274 deletions(-)
delete mode 100644 patches/xenserver/etc/sysconfig/iptables-domr
delete mode 100644 patches/xenserver/root/.ssh/authorized_keys
delete mode 100755 patches/xenserver/root/patchsystemvm.sh
delete mode 100644 scripts/vm/hypervisor/xenserver/id_rsa.cloud
diff --git a/build/build-cloud.xml b/build/build-cloud.xml
index 4d52d08bb01..db9e5a7c5af 100755
--- a/build/build-cloud.xml
+++ b/build/build-cloud.xml
@@ -107,10 +107,6 @@
-
-
-
-
@@ -523,8 +519,7 @@
-
-
+
@@ -536,26 +531,8 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
diff --git a/build/developer.xml b/build/developer.xml
index 33d77a6c85a..77d760b2af7 100755
--- a/build/developer.xml
+++ b/build/developer.xml
@@ -100,7 +100,7 @@
-
+
@@ -114,6 +114,7 @@
+
diff --git a/build/package.xml b/build/package.xml
index fce58ddcd5e..82781c61a2f 100755
--- a/build/package.xml
+++ b/build/package.xml
@@ -94,7 +94,7 @@
-
+
@@ -103,18 +103,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
@@ -135,7 +123,7 @@
-
+
diff --git a/client/tomcatconf/components.xml.in b/client/tomcatconf/components.xml.in
index 91141cff203..ce698854bbe 100755
--- a/client/tomcatconf/components.xml.in
+++ b/client/tomcatconf/components.xml.in
@@ -110,9 +110,7 @@
-
-
-
+
diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
index cf552dabc4c..d88b50528cd 100644
--- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
+++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
@@ -152,7 +152,6 @@ import com.cloud.host.Host.Type;
import com.cloud.hypervisor.Hypervisor;
import com.cloud.network.Network.BroadcastDomainType;
import com.cloud.network.Network.TrafficType;
-import com.cloud.hypervisor.xen.resource.XenServerConnectionPool.XenServerConnection;
import com.cloud.resource.ServerResource;
import com.cloud.storage.Storage;
import com.cloud.storage.Storage.ImageFormat;
@@ -1064,7 +1063,29 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
}
protected Answer execute(ModifySshKeysCommand cmd) {
- return new Answer(cmd);
+ String publickey = cmd.getPubKey();
+ String privatekey = cmd.getPrvKey();
+
+ com.trilead.ssh2.Connection sshConnection = new com.trilead.ssh2.Connection(_host.ip, 22);
+ try {
+ sshConnection.connect(null, 60000, 60000);
+ if (!sshConnection.authenticateWithPassword(_username, _password)) {
+ throw new Exception("Unable to authenticate");
+ }
+ SCPClient scp = new SCPClient(sshConnection);
+
+ scp.put(publickey.getBytes(), "id_rsa.pub", "/opt/xensource/bin", "0600");
+ scp.put(privatekey.getBytes(), "id_rsa", "/opt/xensource/bin", "0600");
+ scp.put(privatekey.getBytes(), "id_rsa.cloud", "/root/.ssh", "0600");
+ return new Answer(cmd);
+
+ } catch (Exception e) {
+ String msg = " scp ssh key failed due to " + e.toString() + " - " + e.getMessage();
+ s_logger.warn(msg);
+ } finally {
+ sshConnection.close();
+ }
+ return new Answer(cmd, false, "modifySshkeys failed");
}
private boolean doPingTest(final String computingHostIp) {
@@ -3166,6 +3187,13 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
Ternary mount = mounts.get(0);
+ if (!patchSystemVm(mount.second(), vmName)) { // FIXME make this
+ // nonspecific
+ String msg = "patch system vm failed";
+ s_logger.warn(msg);
+ return msg;
+ }
+
Set templates = VM.getByNameLabel(conn, "CentOS 5.3");
if (templates.size() == 0) {
templates = VM.getByNameLabel(conn, "CentOS 5.3 (64-bit)");
@@ -3204,17 +3232,6 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
vbdr.type = Types.VbdType.DISK;
VBD.create(conn, vbdr);
-
- /* create CD-ROM VBD */
- VBD.Record cdromVBDR = new VBD.Record();
- cdromVBDR.VM = vm;
- cdromVBDR.empty = true;
- cdromVBDR.bootable = false;
- cdromVBDR.userdevice = "3";
- cdromVBDR.mode = Types.VbdMode.RO;
- cdromVBDR.type = Types.VbdType.CD;
- VBD cdromVBD = VBD.create(conn, cdromVBDR);
- cdromVBD.insert(conn, VDI.getByUuid(conn, _host.systemvmisouuid));
/* create VIF0 */
VIF.Record vifr = new VIF.Record();
@@ -3491,6 +3508,8 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
s_logger.debug("Slave logon successful. session= " + slaveSession);
}
Host host = Host.getByUuid(slaveConn, _host.uuid);
+
+
for (int i = 0; i < params.length; i += 2) {
args.put(params[i], params[i + 1]);
}
@@ -3994,38 +4013,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
try {
Host myself = Host.getByUuid(conn, _host.uuid);
_host.pool = getPoolUuid();
-
- boolean findsystemvmiso = false;
- Set srs = SR.getByNameLabel(conn, "XenServer Tools");
- if( srs.size() != 1 ) {
- throw new CloudRuntimeException("There are " + srs.size() + " SRs with name XenServer Tools");
- }
- SR sr = srs.iterator().next();
- sr.scan(conn);
- SR.Record srr = sr.getRecord(conn);
- _host.systemvmisouuid = null;
- for( VDI vdi : srr.VDIs ) {
- VDI.Record vdir = vdi.getRecord(conn);
- if(vdir.nameLabel.contains("systemvm-premium")){
- _host.systemvmisouuid = vdir.uuid;
- break;
- }
- }
- if( _host.systemvmisouuid == null ) {
- for( VDI vdi : srr.VDIs ) {
- VDI.Record vdir = vdi.getRecord(conn);
- if(vdir.nameLabel.contains("systemvm")){
- _host.systemvmisouuid = vdir.uuid;
- break;
- }
- }
- }
-
- if( _host.systemvmisouuid == null ) {
- throw new CloudRuntimeException("can not find systemvmiso");
- }
-
String name = "cloud-private";
if (_privateNetworkName != null) {
name = _privateNetworkName;
@@ -4356,13 +4344,17 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
scp.put(f, d, p);
}
-
} catch (IOException e) {
throw new CloudRuntimeException("Unable to setup the server correctly", e);
} finally {
sshConnection.close();
}
+ try {
+ // wait 2 seconds before call plugin
+ Thread.sleep(2000);
+ } catch (final InterruptedException ex) {
+ }
if (!setIptables()) {
s_logger.warn("set xenserver Iptable failed");
}
@@ -6647,7 +6639,6 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
// the resource first connects to XenServer. These UUIDs do
// not change over time.
protected class XenServerHost {
- public String systemvmisouuid;
public String uuid;
public String ip;
public String publicNetwork;
diff --git a/patches/xenserver/etc/sysconfig/iptables-domr b/patches/xenserver/etc/sysconfig/iptables-domr
deleted file mode 100644
index 3bc7b50f74a..00000000000
--- a/patches/xenserver/etc/sysconfig/iptables-domr
+++ /dev/null
@@ -1,24 +0,0 @@
-*nat
-:PREROUTING ACCEPT [0:0]
-:POSTROUTING ACCEPT [0:0]
-:OUTPUT ACCEPT [0:0]
-COMMIT
-*filter
-:INPUT DROP [0:0]
-:FORWARD DROP [0:0]
-:OUTPUT ACCEPT [0:0]
--A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
--A INPUT -i eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
--A INPUT -i eth2 -m state --state RELATED,ESTABLISHED -j ACCEPT
--A INPUT -p icmp -j ACCEPT
--A INPUT -i lo -j ACCEPT
--A INPUT -i eth0 -p udp -m udp --dport 67 -j ACCEPT
--A INPUT -i eth0 -p udp -m udp --dport 53 -j ACCEPT
--A INPUT -i eth1 -p tcp -m state --state NEW --dport 3922 -j ACCEPT
--A INPUT -i eth0 -p tcp -m state --state NEW --dport 8080 -j ACCEPT
--A INPUT -i eth0 -p tcp -m state --state NEW --dport 80 -j ACCEPT
--A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
--A FORWARD -i eth0 -o eth2 -j ACCEPT
--A FORWARD -i eth2 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-COMMIT
-
diff --git a/patches/xenserver/root/.ssh/authorized_keys b/patches/xenserver/root/.ssh/authorized_keys
deleted file mode 100644
index 2cb275c2582..00000000000
--- a/patches/xenserver/root/.ssh/authorized_keys
+++ /dev/null
@@ -1 +0,0 @@
-ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA3VD1tGRDn3stlJvPNXmQZdQCNjqcfY+xlitd5q0n3KYqJ5OBrty3/00XBUdLt31TbQ4dv+GR7uEr+ex7rm0jjmTFKV4rHYPi882CuC5+bkBp5R4k+mpcyKbxb+IoNS9ItbiExQxMiiRQpHvNem0GGnNFO3lElRPwUFs8evTvZu5HcTj4k4RJLJ66jeIGJ3sMAJ03SICGwfEZjrsyeOMwJk7cH8WNeuNzxzoZd9v02eI0lHdK9O5z7FwrxvRBbzsmJ0EwuhbH8pR7WR6kGLTNP9KEwtrnzV1LYWd+rFoSeh6ImExG7fma3Ldydg8CPTQsjvCEQUxiuV1/x5am5VJlUw== root@r-6-TEST
diff --git a/patches/xenserver/root/patchsystemvm.sh b/patches/xenserver/root/patchsystemvm.sh
deleted file mode 100755
index f878ea11aa8..00000000000
--- a/patches/xenserver/root/patchsystemvm.sh
+++ /dev/null
@@ -1,121 +0,0 @@
-#/bin/bash
-# $Id: patchsystemvm.sh 10800 2010-07-16 13:48:39Z edison $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x/java/scripts/vm/hypervisor/xenserver/prepsystemvm.sh $
-
-#set -x
-logfile="/var/log/patchsystemvm.log"
-#
-# To use existing console proxy .zip-based package file
-#
-patch_console_proxy() {
- local patchfile=$1
- rm /usr/local/cloud/systemvm -rf
- mkdir -p /usr/local/cloud/systemvm
- echo "All" | unzip $patchfile -d /usr/local/cloud/systemvm >$logfile 2>&1
- find /usr/local/cloud/systemvm/ -name \*.sh | xargs chmod 555
- return 0
-}
-
-consoleproxy_svcs() {
- chkconfig cloud on
- chkconfig postinit on
- chkconfig domr_webserver off
- chkconfig haproxy off ;
- chkconfig dnsmasq off
- chkconfig sshd on
- chkconfig httpd off
- chkconfig nfs off
- chkconfig nfslock off
- chkconfig rpcbind off
- chkconfig rpcidmap off
- cp /etc/sysconfig/iptables-consoleproxy /etc/sysconfig/iptables
- mkdir -p /var/log/cloud
-}
-
-secstorage_svcs() {
- chkconfig cloud on
- chkconfig postinit on
- chkconfig domr_webserver off
- chkconfig haproxy off ;
- chkconfig dnsmasq off
- chkconfig sshd on
- chkconfig httpd off
- cp /etc/sysconfig/iptables-secstorage /etc/sysconfig/iptables
- mkdir -p /var/log/cloud
-}
-
-routing_svcs() {
- chkconfig cloud off
- chkconfig domr_webserver on ;
- chkconfig haproxy on ;
- chkconfig dnsmasq on
- chkconfig sshd on
- chkconfig nfs off
- chkconfig nfslock off
- chkconfig rpcbind off
- chkconfig rpcidmap off
- cp /etc/sysconfig/iptables-domr /etc/sysconfig/iptables
-}
-
-CMDLINE=$(cat /proc/cmdline)
-TYPE="router"
-
-for i in $CMDLINE
- do
- # search for foo=bar pattern and cut out foo
- KEY=$(echo $i | cut -d= -f1)
- VALUE=$(echo $i | cut -d= -f2)
- case $KEY in
- type)
- TYPE=$VALUE
- ;;
- *)
- ;;
- esac
-done
-
-if [ "$TYPE" == "consoleproxy" ] || [ "$TYPE" == "secstorage" ] && [ -f /media/cdrom/systemvm.zip ]
-then
- patch_console_proxy /media/cdrom/systemvm.zip
- if [ $? -gt 0 ]
- then
- printf "Failed to apply patch systemvm\n" >$logfile
- exit 5
- fi
-fi
-
-
-#empty known hosts
-echo "" > /root/.ssh/known_hosts
-
-if [ "$TYPE" == "router" ]
-then
- routing_svcs
- if [ $? -gt 0 ]
- then
- printf "Failed to execute routing_svcs\n" >$logfile
- exit 6
- fi
-fi
-
-
-if [ "$TYPE" == "consoleproxy" ]
-then
- consoleproxy_svcs
- if [ $? -gt 0 ]
- then
- printf "Failed to execute consoleproxy_svcs\n" >$logfile
- exit 7
- fi
-fi
-
-if [ "$TYPE" == "secstorage" ]
-then
- secstorage_svcs
- if [ $? -gt 0 ]
- then
- printf "Failed to execute secstorage_svcs\n" >$logfile
- exit 8
- fi
-fi
-
-exit $?
diff --git a/scripts/vm/hypervisor/xenserver/id_rsa.cloud b/scripts/vm/hypervisor/xenserver/id_rsa.cloud
deleted file mode 100644
index ea46a3cebb6..00000000000
--- a/scripts/vm/hypervisor/xenserver/id_rsa.cloud
+++ /dev/null
@@ -1,27 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIIEogIBAAKCAQEA3VD1tGRDn3stlJvPNXmQZdQCNjqcfY+xlitd5q0n3KYqJ5OB
-rty3/00XBUdLt31TbQ4dv+GR7uEr+ex7rm0jjmTFKV4rHYPi882CuC5+bkBp5R4k
-+mpcyKbxb+IoNS9ItbiExQxMiiRQpHvNem0GGnNFO3lElRPwUFs8evTvZu5HcTj4
-k4RJLJ66jeIGJ3sMAJ03SICGwfEZjrsyeOMwJk7cH8WNeuNzxzoZd9v02eI0lHdK
-9O5z7FwrxvRBbzsmJ0EwuhbH8pR7WR6kGLTNP9KEwtrnzV1LYWd+rFoSeh6ImExG
-7fma3Ldydg8CPTQsjvCEQUxiuV1/x5am5VJlUwIBIwKCAQEA0KtrUk/n/MSYsLAp
-xLRyNB+qUGMl1Xjao4f5cxhKJ8/emlfgrC8xI+mZXL+QiG7ZoVZz0ixzprcMNMkG
-5kmlLnxE3dxxy18Xz+2nIq9+hTVrKHuB82uZT3jVAxcP96GcU5C3snlPeu8KNK8+
-FFgqU3P/cpbo5FSgwMsNI3k5fkyffYtmBdtjZhWXJqnA9+bMdCmYEKyQFWp18LvV
-pjGx1jLFZTx9+aDz7gdIk21zbVXmwQmnS1fVKJEByTMvokpvdJUvDedvpgqGqX/g
-IXkTXe49pYhYwxVguLK6FXyQBwOuUsnur2A79T3wBvzEMozkYLkEG/zcw0fyo3iC
-fdzc6wKBgQD2gq+kUc2r/+xE+smIej2ICvFZZlSh1ko2tVmVUHuuuMCuBt054Dq9
-mf8/yIbXSvVtuBMJ+jewVnKfhucEQKf6E1jBdQShezlomFLOQ8cFQJhT6tAwJl/k
-TR+OjeTuOcBknkE8nstNt7hAkZxY6h/Lu54OM9AkXyZ9skx7gHh+IwKBgQDl1f09
-YkoM9rqXM8lMKjF0z81T4ACCaFUA6ZKjSZelyG+azJDlRFNWX1In3Kq6aInpZPzs
-owwIS9tjkXIaLR1wDJ+K8IGJQ19sqCzv3/kBCDXA6mqXkkPR80xRi4wuZ3lETOdL
-OBXPffuQaKxk32esqsxK6As1LgH4+048JS23EQKBgQCpCSf7pc7cV7f0yTm8q5fo
-QgSVEvg0da87dQo6gFTPlKFhY8rl25X+WvgrvLQ726D6x12DLzwhJVXpu5cY2+Dl
-/qNC0+XrEqsF5MsRGIh4oVKCr6SzTYOVPDLlaJz7IElpkRbKe4QYCPNfecpLmTpf
-0Rvse0zlvZa8l4Tm+QIqmwKBgBOzQZeMFPnMAV1q1r1is8gvEZl5maTHHTqXrXu1
-2cxhoyqGkBOmxVCL09eH8WBvXEc0irUyjAC2C32QH7kZz1K/QOAF/Hl6zao6TP6e
-K0k7N861AdJ6QFPTBoqlj6w0wUBeXPfRm3gvXrSbQfoEhTqvjdqI6wSO6jnpp57B
-W7CbAoGABFHMVXEyT3SliMSRtiCuDOrtl9E/aiOByPulXolqth5WDSel31Lz+iY7
-ldOLNQO/oononTStdd0fDGChl3WXBSOToJJ/HjIWH05bDY9n2EDAyZvmaW9rX3JQ
-pH9c/1vlD9lxDEBvq4JXmTtdL0Ho00F5vVHnWnwINtfx6c5BIjg=
------END RSA PRIVATE KEY-----
diff --git a/scripts/vm/hypervisor/xenserver/xenserver56/patch b/scripts/vm/hypervisor/xenserver/xenserver56/patch
index 14b4039c5a2..15b8908ddb5 100644
--- a/scripts/vm/hypervisor/xenserver/xenserver56/patch
+++ b/scripts/vm/hypervisor/xenserver/xenserver56/patch
@@ -18,12 +18,9 @@ nfs.py=/opt/xensource/sm
patch.tgz=..,0775,/opt/xensource/bin
vmops=..,0755,/etc/xapi.d/plugins
vmopsSnapshot=..,0755,/etc/xapi.d/plugins
-xs_cleanup.sh=..,0755,/opt/xensource/bin
-systemvm-premium.iso=../../../../../vms,0644,/opt/xensource/packages/iso
-systemvm.iso=../../../../../vms,0644,/opt/xensource/packages/iso
+systemvm-premium.zip=../../../../../vms,0755,/opt/xensource/bin
hostvmstats.py=..,0755,/opt/xensource/sm
-id_rsa.cloud=..,0600,/opt/xensource/bin
-id_rsa.cloud=..,0600,/root/.ssh
+xs_cleanup.sh=..,0755,/opt/xensource/bin
network_info.sh=..,0755,/opt/xensource/bin
prepsystemvm.sh=..,0755,/opt/xensource/bin
setupxenserver.sh=..,0755,/opt/xensource/bin
diff --git a/server/src/com/cloud/alert/AlertManagerImpl.java b/server/src/com/cloud/alert/AlertManagerImpl.java
index 033b1ba3282..378bc5dc699 100644
--- a/server/src/com/cloud/alert/AlertManagerImpl.java
+++ b/server/src/com/cloud/alert/AlertManagerImpl.java
@@ -153,8 +153,7 @@ public class AlertManagerImpl implements AlertManager {
smtpDebug = Boolean.parseBoolean(smtpDebugStr);
}
- _emailAlert = new EmailAlert(emailAddresses, smtpHost, smtpPort, useAuth, smtpUsername, smtpPassword, emailSender, smtpDebug);
- _emailAlert = null;
+ _emailAlert = new EmailAlert(emailAddresses, smtpHost, smtpPort, useAuth, smtpUsername, smtpPassword, emailSender, smtpDebug);
String storageCapacityThreshold = configs.get("storage.capacity.threshold");
String cpuCapacityThreshold = configs.get("cpu.capacity.threshold");
diff --git a/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java b/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java
index e7dc2a20fbb..049d9a70923 100644
--- a/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java
+++ b/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java
@@ -52,7 +52,6 @@ import com.cloud.host.Status;
import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.xen.resource.CitrixResourceBase;
import com.cloud.hypervisor.xen.resource.XcpServerResource;
-import com.cloud.hypervisor.xen.resource.XenServerResource;
import com.cloud.hypervisor.xen.resource.XenServerConnectionPool;
import com.cloud.resource.Discoverer;
import com.cloud.resource.DiscovererBase;
@@ -383,10 +382,10 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L
if(prodBrand.equals("XenCloudPlatform") && prodVersion.equals("0.1.1"))
return new XcpServerResource();
- if(prodBrand.equals("XenServer") && prodVersion.equals("5.6.0"))
- return new XenServerResource();
+// if(prodBrand.equals("XenServer") && prodVersion.equals("5.6.0"))
+// return new XenServerResource();
- String msg = "Only support XCP 0.1.1 and XenServer 5.6.0, but this one is " + prodBrand + " " + prodVersion;
+ String msg = "Only support XCP 0.1.1 and Xerver 5.6.0, but this one is " + prodBrand + " " + prodVersion;
_alertMgr.sendAlert(AlertManager.ALERT_TYPE_HOST, dcId, podId, msg, msg);
s_logger.debug(msg);
throw new RuntimeException(msg);
From d72e0538daba5abbdbbbc103167667ee7e2ca3c9 Mon Sep 17 00:00:00 2001
From: Anthony Xu
Date: Thu, 26 Aug 2010 16:06:28 -0700
Subject: [PATCH 032/235] Revert "Revert "use iso to patch systemvm""
This reverts commit 145e2e0aaa9b57286102664787e8e40ad3d75e26.
---
build/build-cloud.xml | 29 ++++-
build/developer.xml | 3 +-
build/package.xml | 16 ++-
client/tomcatconf/components.xml.in | 4 +-
.../xen/resource/CitrixResourceBase.java | 83 ++++++------
patches/xenserver/etc/sysconfig/iptables-domr | 24 ++++
patches/xenserver/root/.ssh/authorized_keys | 1 +
patches/xenserver/root/patchsystemvm.sh | 121 ++++++++++++++++++
scripts/vm/hypervisor/xenserver/id_rsa.cloud | 27 ++++
.../vm/hypervisor/xenserver/xenserver56/patch | 7 +-
.../src/com/cloud/alert/AlertManagerImpl.java | 3 +-
.../xen/discoverer/XcpServerDiscoverer.java | 7 +-
12 files changed, 274 insertions(+), 51 deletions(-)
create mode 100644 patches/xenserver/etc/sysconfig/iptables-domr
create mode 100644 patches/xenserver/root/.ssh/authorized_keys
create mode 100755 patches/xenserver/root/patchsystemvm.sh
create mode 100644 scripts/vm/hypervisor/xenserver/id_rsa.cloud
diff --git a/build/build-cloud.xml b/build/build-cloud.xml
index db9e5a7c5af..4d52d08bb01 100755
--- a/build/build-cloud.xml
+++ b/build/build-cloud.xml
@@ -107,6 +107,10 @@
+
+
+
+
@@ -519,7 +523,8 @@
-
+
+
@@ -531,8 +536,26 @@
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/build/developer.xml b/build/developer.xml
index 77d760b2af7..33d77a6c85a 100755
--- a/build/developer.xml
+++ b/build/developer.xml
@@ -100,7 +100,7 @@
-
+
@@ -114,7 +114,6 @@
-
diff --git a/build/package.xml b/build/package.xml
index 82781c61a2f..fce58ddcd5e 100755
--- a/build/package.xml
+++ b/build/package.xml
@@ -94,7 +94,7 @@
-
+
@@ -103,6 +103,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
@@ -123,7 +135,7 @@
-
+
diff --git a/client/tomcatconf/components.xml.in b/client/tomcatconf/components.xml.in
index ce698854bbe..91141cff203 100755
--- a/client/tomcatconf/components.xml.in
+++ b/client/tomcatconf/components.xml.in
@@ -110,7 +110,9 @@
-
+
+
+
diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
index d88b50528cd..cf552dabc4c 100644
--- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
+++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
@@ -152,6 +152,7 @@ import com.cloud.host.Host.Type;
import com.cloud.hypervisor.Hypervisor;
import com.cloud.network.Network.BroadcastDomainType;
import com.cloud.network.Network.TrafficType;
+import com.cloud.hypervisor.xen.resource.XenServerConnectionPool.XenServerConnection;
import com.cloud.resource.ServerResource;
import com.cloud.storage.Storage;
import com.cloud.storage.Storage.ImageFormat;
@@ -1063,29 +1064,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
}
protected Answer execute(ModifySshKeysCommand cmd) {
- String publickey = cmd.getPubKey();
- String privatekey = cmd.getPrvKey();
-
- com.trilead.ssh2.Connection sshConnection = new com.trilead.ssh2.Connection(_host.ip, 22);
- try {
- sshConnection.connect(null, 60000, 60000);
- if (!sshConnection.authenticateWithPassword(_username, _password)) {
- throw new Exception("Unable to authenticate");
- }
- SCPClient scp = new SCPClient(sshConnection);
-
- scp.put(publickey.getBytes(), "id_rsa.pub", "/opt/xensource/bin", "0600");
- scp.put(privatekey.getBytes(), "id_rsa", "/opt/xensource/bin", "0600");
- scp.put(privatekey.getBytes(), "id_rsa.cloud", "/root/.ssh", "0600");
- return new Answer(cmd);
-
- } catch (Exception e) {
- String msg = " scp ssh key failed due to " + e.toString() + " - " + e.getMessage();
- s_logger.warn(msg);
- } finally {
- sshConnection.close();
- }
- return new Answer(cmd, false, "modifySshkeys failed");
+ return new Answer(cmd);
}
private boolean doPingTest(final String computingHostIp) {
@@ -3187,13 +3166,6 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
Ternary mount = mounts.get(0);
- if (!patchSystemVm(mount.second(), vmName)) { // FIXME make this
- // nonspecific
- String msg = "patch system vm failed";
- s_logger.warn(msg);
- return msg;
- }
-
Set templates = VM.getByNameLabel(conn, "CentOS 5.3");
if (templates.size() == 0) {
templates = VM.getByNameLabel(conn, "CentOS 5.3 (64-bit)");
@@ -3232,6 +3204,17 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
vbdr.type = Types.VbdType.DISK;
VBD.create(conn, vbdr);
+
+ /* create CD-ROM VBD */
+ VBD.Record cdromVBDR = new VBD.Record();
+ cdromVBDR.VM = vm;
+ cdromVBDR.empty = true;
+ cdromVBDR.bootable = false;
+ cdromVBDR.userdevice = "3";
+ cdromVBDR.mode = Types.VbdMode.RO;
+ cdromVBDR.type = Types.VbdType.CD;
+ VBD cdromVBD = VBD.create(conn, cdromVBDR);
+ cdromVBD.insert(conn, VDI.getByUuid(conn, _host.systemvmisouuid));
/* create VIF0 */
VIF.Record vifr = new VIF.Record();
@@ -3508,8 +3491,6 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
s_logger.debug("Slave logon successful. session= " + slaveSession);
}
Host host = Host.getByUuid(slaveConn, _host.uuid);
-
-
for (int i = 0; i < params.length; i += 2) {
args.put(params[i], params[i + 1]);
}
@@ -4013,7 +3994,38 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
try {
Host myself = Host.getByUuid(conn, _host.uuid);
_host.pool = getPoolUuid();
+
+ boolean findsystemvmiso = false;
+ Set srs = SR.getByNameLabel(conn, "XenServer Tools");
+ if( srs.size() != 1 ) {
+ throw new CloudRuntimeException("There are " + srs.size() + " SRs with name XenServer Tools");
+ }
+ SR sr = srs.iterator().next();
+ sr.scan(conn);
+ SR.Record srr = sr.getRecord(conn);
+ _host.systemvmisouuid = null;
+ for( VDI vdi : srr.VDIs ) {
+ VDI.Record vdir = vdi.getRecord(conn);
+ if(vdir.nameLabel.contains("systemvm-premium")){
+ _host.systemvmisouuid = vdir.uuid;
+ break;
+ }
+ }
+ if( _host.systemvmisouuid == null ) {
+ for( VDI vdi : srr.VDIs ) {
+ VDI.Record vdir = vdi.getRecord(conn);
+ if(vdir.nameLabel.contains("systemvm")){
+ _host.systemvmisouuid = vdir.uuid;
+ break;
+ }
+ }
+ }
+
+ if( _host.systemvmisouuid == null ) {
+ throw new CloudRuntimeException("can not find systemvmiso");
+ }
+
String name = "cloud-private";
if (_privateNetworkName != null) {
name = _privateNetworkName;
@@ -4344,17 +4356,13 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
scp.put(f, d, p);
}
+
} catch (IOException e) {
throw new CloudRuntimeException("Unable to setup the server correctly", e);
} finally {
sshConnection.close();
}
- try {
- // wait 2 seconds before call plugin
- Thread.sleep(2000);
- } catch (final InterruptedException ex) {
- }
if (!setIptables()) {
s_logger.warn("set xenserver Iptable failed");
}
@@ -6639,6 +6647,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
// the resource first connects to XenServer. These UUIDs do
// not change over time.
protected class XenServerHost {
+ public String systemvmisouuid;
public String uuid;
public String ip;
public String publicNetwork;
diff --git a/patches/xenserver/etc/sysconfig/iptables-domr b/patches/xenserver/etc/sysconfig/iptables-domr
new file mode 100644
index 00000000000..3bc7b50f74a
--- /dev/null
+++ b/patches/xenserver/etc/sysconfig/iptables-domr
@@ -0,0 +1,24 @@
+*nat
+:PREROUTING ACCEPT [0:0]
+:POSTROUTING ACCEPT [0:0]
+:OUTPUT ACCEPT [0:0]
+COMMIT
+*filter
+:INPUT DROP [0:0]
+:FORWARD DROP [0:0]
+:OUTPUT ACCEPT [0:0]
+-A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
+-A INPUT -i eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
+-A INPUT -i eth2 -m state --state RELATED,ESTABLISHED -j ACCEPT
+-A INPUT -p icmp -j ACCEPT
+-A INPUT -i lo -j ACCEPT
+-A INPUT -i eth0 -p udp -m udp --dport 67 -j ACCEPT
+-A INPUT -i eth0 -p udp -m udp --dport 53 -j ACCEPT
+-A INPUT -i eth1 -p tcp -m state --state NEW --dport 3922 -j ACCEPT
+-A INPUT -i eth0 -p tcp -m state --state NEW --dport 8080 -j ACCEPT
+-A INPUT -i eth0 -p tcp -m state --state NEW --dport 80 -j ACCEPT
+-A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
+-A FORWARD -i eth0 -o eth2 -j ACCEPT
+-A FORWARD -i eth2 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
+COMMIT
+
diff --git a/patches/xenserver/root/.ssh/authorized_keys b/patches/xenserver/root/.ssh/authorized_keys
new file mode 100644
index 00000000000..2cb275c2582
--- /dev/null
+++ b/patches/xenserver/root/.ssh/authorized_keys
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA3VD1tGRDn3stlJvPNXmQZdQCNjqcfY+xlitd5q0n3KYqJ5OBrty3/00XBUdLt31TbQ4dv+GR7uEr+ex7rm0jjmTFKV4rHYPi882CuC5+bkBp5R4k+mpcyKbxb+IoNS9ItbiExQxMiiRQpHvNem0GGnNFO3lElRPwUFs8evTvZu5HcTj4k4RJLJ66jeIGJ3sMAJ03SICGwfEZjrsyeOMwJk7cH8WNeuNzxzoZd9v02eI0lHdK9O5z7FwrxvRBbzsmJ0EwuhbH8pR7WR6kGLTNP9KEwtrnzV1LYWd+rFoSeh6ImExG7fma3Ldydg8CPTQsjvCEQUxiuV1/x5am5VJlUw== root@r-6-TEST
diff --git a/patches/xenserver/root/patchsystemvm.sh b/patches/xenserver/root/patchsystemvm.sh
new file mode 100755
index 00000000000..f878ea11aa8
--- /dev/null
+++ b/patches/xenserver/root/patchsystemvm.sh
@@ -0,0 +1,121 @@
+#/bin/bash
+# $Id: patchsystemvm.sh 10800 2010-07-16 13:48:39Z edison $ $HeadURL: svn://svn.lab.vmops.com/repos/branches/2.1.x/java/scripts/vm/hypervisor/xenserver/prepsystemvm.sh $
+
+#set -x
+logfile="/var/log/patchsystemvm.log"
+#
+# To use existing console proxy .zip-based package file
+#
+patch_console_proxy() {
+ local patchfile=$1
+ rm /usr/local/cloud/systemvm -rf
+ mkdir -p /usr/local/cloud/systemvm
+ echo "All" | unzip $patchfile -d /usr/local/cloud/systemvm >$logfile 2>&1
+ find /usr/local/cloud/systemvm/ -name \*.sh | xargs chmod 555
+ return 0
+}
+
+consoleproxy_svcs() {
+ chkconfig cloud on
+ chkconfig postinit on
+ chkconfig domr_webserver off
+ chkconfig haproxy off ;
+ chkconfig dnsmasq off
+ chkconfig sshd on
+ chkconfig httpd off
+ chkconfig nfs off
+ chkconfig nfslock off
+ chkconfig rpcbind off
+ chkconfig rpcidmap off
+ cp /etc/sysconfig/iptables-consoleproxy /etc/sysconfig/iptables
+ mkdir -p /var/log/cloud
+}
+
+secstorage_svcs() {
+ chkconfig cloud on
+ chkconfig postinit on
+ chkconfig domr_webserver off
+ chkconfig haproxy off ;
+ chkconfig dnsmasq off
+ chkconfig sshd on
+ chkconfig httpd off
+ cp /etc/sysconfig/iptables-secstorage /etc/sysconfig/iptables
+ mkdir -p /var/log/cloud
+}
+
+routing_svcs() {
+ chkconfig cloud off
+ chkconfig domr_webserver on ;
+ chkconfig haproxy on ;
+ chkconfig dnsmasq on
+ chkconfig sshd on
+ chkconfig nfs off
+ chkconfig nfslock off
+ chkconfig rpcbind off
+ chkconfig rpcidmap off
+ cp /etc/sysconfig/iptables-domr /etc/sysconfig/iptables
+}
+
+CMDLINE=$(cat /proc/cmdline)
+TYPE="router"
+
+for i in $CMDLINE
+ do
+ # search for foo=bar pattern and cut out foo
+ KEY=$(echo $i | cut -d= -f1)
+ VALUE=$(echo $i | cut -d= -f2)
+ case $KEY in
+ type)
+ TYPE=$VALUE
+ ;;
+ *)
+ ;;
+ esac
+done
+
+if [ "$TYPE" == "consoleproxy" ] || [ "$TYPE" == "secstorage" ] && [ -f /media/cdrom/systemvm.zip ]
+then
+ patch_console_proxy /media/cdrom/systemvm.zip
+ if [ $? -gt 0 ]
+ then
+ printf "Failed to apply patch systemvm\n" >$logfile
+ exit 5
+ fi
+fi
+
+
+#empty known hosts
+echo "" > /root/.ssh/known_hosts
+
+if [ "$TYPE" == "router" ]
+then
+ routing_svcs
+ if [ $? -gt 0 ]
+ then
+ printf "Failed to execute routing_svcs\n" >$logfile
+ exit 6
+ fi
+fi
+
+
+if [ "$TYPE" == "consoleproxy" ]
+then
+ consoleproxy_svcs
+ if [ $? -gt 0 ]
+ then
+ printf "Failed to execute consoleproxy_svcs\n" >$logfile
+ exit 7
+ fi
+fi
+
+if [ "$TYPE" == "secstorage" ]
+then
+ secstorage_svcs
+ if [ $? -gt 0 ]
+ then
+ printf "Failed to execute secstorage_svcs\n" >$logfile
+ exit 8
+ fi
+fi
+
+exit $?
diff --git a/scripts/vm/hypervisor/xenserver/id_rsa.cloud b/scripts/vm/hypervisor/xenserver/id_rsa.cloud
new file mode 100644
index 00000000000..ea46a3cebb6
--- /dev/null
+++ b/scripts/vm/hypervisor/xenserver/id_rsa.cloud
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEogIBAAKCAQEA3VD1tGRDn3stlJvPNXmQZdQCNjqcfY+xlitd5q0n3KYqJ5OB
+rty3/00XBUdLt31TbQ4dv+GR7uEr+ex7rm0jjmTFKV4rHYPi882CuC5+bkBp5R4k
++mpcyKbxb+IoNS9ItbiExQxMiiRQpHvNem0GGnNFO3lElRPwUFs8evTvZu5HcTj4
+k4RJLJ66jeIGJ3sMAJ03SICGwfEZjrsyeOMwJk7cH8WNeuNzxzoZd9v02eI0lHdK
+9O5z7FwrxvRBbzsmJ0EwuhbH8pR7WR6kGLTNP9KEwtrnzV1LYWd+rFoSeh6ImExG
+7fma3Ldydg8CPTQsjvCEQUxiuV1/x5am5VJlUwIBIwKCAQEA0KtrUk/n/MSYsLAp
+xLRyNB+qUGMl1Xjao4f5cxhKJ8/emlfgrC8xI+mZXL+QiG7ZoVZz0ixzprcMNMkG
+5kmlLnxE3dxxy18Xz+2nIq9+hTVrKHuB82uZT3jVAxcP96GcU5C3snlPeu8KNK8+
+FFgqU3P/cpbo5FSgwMsNI3k5fkyffYtmBdtjZhWXJqnA9+bMdCmYEKyQFWp18LvV
+pjGx1jLFZTx9+aDz7gdIk21zbVXmwQmnS1fVKJEByTMvokpvdJUvDedvpgqGqX/g
+IXkTXe49pYhYwxVguLK6FXyQBwOuUsnur2A79T3wBvzEMozkYLkEG/zcw0fyo3iC
+fdzc6wKBgQD2gq+kUc2r/+xE+smIej2ICvFZZlSh1ko2tVmVUHuuuMCuBt054Dq9
+mf8/yIbXSvVtuBMJ+jewVnKfhucEQKf6E1jBdQShezlomFLOQ8cFQJhT6tAwJl/k
+TR+OjeTuOcBknkE8nstNt7hAkZxY6h/Lu54OM9AkXyZ9skx7gHh+IwKBgQDl1f09
+YkoM9rqXM8lMKjF0z81T4ACCaFUA6ZKjSZelyG+azJDlRFNWX1In3Kq6aInpZPzs
+owwIS9tjkXIaLR1wDJ+K8IGJQ19sqCzv3/kBCDXA6mqXkkPR80xRi4wuZ3lETOdL
+OBXPffuQaKxk32esqsxK6As1LgH4+048JS23EQKBgQCpCSf7pc7cV7f0yTm8q5fo
+QgSVEvg0da87dQo6gFTPlKFhY8rl25X+WvgrvLQ726D6x12DLzwhJVXpu5cY2+Dl
+/qNC0+XrEqsF5MsRGIh4oVKCr6SzTYOVPDLlaJz7IElpkRbKe4QYCPNfecpLmTpf
+0Rvse0zlvZa8l4Tm+QIqmwKBgBOzQZeMFPnMAV1q1r1is8gvEZl5maTHHTqXrXu1
+2cxhoyqGkBOmxVCL09eH8WBvXEc0irUyjAC2C32QH7kZz1K/QOAF/Hl6zao6TP6e
+K0k7N861AdJ6QFPTBoqlj6w0wUBeXPfRm3gvXrSbQfoEhTqvjdqI6wSO6jnpp57B
+W7CbAoGABFHMVXEyT3SliMSRtiCuDOrtl9E/aiOByPulXolqth5WDSel31Lz+iY7
+ldOLNQO/oononTStdd0fDGChl3WXBSOToJJ/HjIWH05bDY9n2EDAyZvmaW9rX3JQ
+pH9c/1vlD9lxDEBvq4JXmTtdL0Ho00F5vVHnWnwINtfx6c5BIjg=
+-----END RSA PRIVATE KEY-----
diff --git a/scripts/vm/hypervisor/xenserver/xenserver56/patch b/scripts/vm/hypervisor/xenserver/xenserver56/patch
index 15b8908ddb5..14b4039c5a2 100644
--- a/scripts/vm/hypervisor/xenserver/xenserver56/patch
+++ b/scripts/vm/hypervisor/xenserver/xenserver56/patch
@@ -18,9 +18,12 @@ nfs.py=/opt/xensource/sm
patch.tgz=..,0775,/opt/xensource/bin
vmops=..,0755,/etc/xapi.d/plugins
vmopsSnapshot=..,0755,/etc/xapi.d/plugins
-systemvm-premium.zip=../../../../../vms,0755,/opt/xensource/bin
-hostvmstats.py=..,0755,/opt/xensource/sm
xs_cleanup.sh=..,0755,/opt/xensource/bin
+systemvm-premium.iso=../../../../../vms,0644,/opt/xensource/packages/iso
+systemvm.iso=../../../../../vms,0644,/opt/xensource/packages/iso
+hostvmstats.py=..,0755,/opt/xensource/sm
+id_rsa.cloud=..,0600,/opt/xensource/bin
+id_rsa.cloud=..,0600,/root/.ssh
network_info.sh=..,0755,/opt/xensource/bin
prepsystemvm.sh=..,0755,/opt/xensource/bin
setupxenserver.sh=..,0755,/opt/xensource/bin
diff --git a/server/src/com/cloud/alert/AlertManagerImpl.java b/server/src/com/cloud/alert/AlertManagerImpl.java
index 378bc5dc699..033b1ba3282 100644
--- a/server/src/com/cloud/alert/AlertManagerImpl.java
+++ b/server/src/com/cloud/alert/AlertManagerImpl.java
@@ -153,7 +153,8 @@ public class AlertManagerImpl implements AlertManager {
smtpDebug = Boolean.parseBoolean(smtpDebugStr);
}
- _emailAlert = new EmailAlert(emailAddresses, smtpHost, smtpPort, useAuth, smtpUsername, smtpPassword, emailSender, smtpDebug);
+ _emailAlert = new EmailAlert(emailAddresses, smtpHost, smtpPort, useAuth, smtpUsername, smtpPassword, emailSender, smtpDebug);
+ _emailAlert = null;
String storageCapacityThreshold = configs.get("storage.capacity.threshold");
String cpuCapacityThreshold = configs.get("cpu.capacity.threshold");
diff --git a/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java b/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java
index 049d9a70923..e7dc2a20fbb 100644
--- a/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java
+++ b/server/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java
@@ -52,6 +52,7 @@ import com.cloud.host.Status;
import com.cloud.host.dao.HostDao;
import com.cloud.hypervisor.xen.resource.CitrixResourceBase;
import com.cloud.hypervisor.xen.resource.XcpServerResource;
+import com.cloud.hypervisor.xen.resource.XenServerResource;
import com.cloud.hypervisor.xen.resource.XenServerConnectionPool;
import com.cloud.resource.Discoverer;
import com.cloud.resource.DiscovererBase;
@@ -382,10 +383,10 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L
if(prodBrand.equals("XenCloudPlatform") && prodVersion.equals("0.1.1"))
return new XcpServerResource();
-// if(prodBrand.equals("XenServer") && prodVersion.equals("5.6.0"))
-// return new XenServerResource();
+ if(prodBrand.equals("XenServer") && prodVersion.equals("5.6.0"))
+ return new XenServerResource();
- String msg = "Only support XCP 0.1.1 and Xerver 5.6.0, but this one is " + prodBrand + " " + prodVersion;
+ String msg = "Only support XCP 0.1.1 and XenServer 5.6.0, but this one is " + prodBrand + " " + prodVersion;
_alertMgr.sendAlert(AlertManager.ALERT_TYPE_HOST, dcId, podId, msg, msg);
s_logger.debug(msg);
throw new RuntimeException(msg);
From 16e981928af570c9e5cffe3b09c27e7ceea754ad Mon Sep 17 00:00:00 2001
From: edison
Date: Thu, 26 Aug 2010 13:15:18 -0700
Subject: [PATCH 033/235] Issue #: 5935, 5937 Status 5935: resolved fixed
Status 5937: resolved fixed
---
.../computing/LibvirtComputingResource.java | 22 +++++++++++++++++++
1 file changed, 22 insertions(+)
diff --git a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java
index 6ae752fd200..90cb53dc497 100644
--- a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java
+++ b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java
@@ -134,6 +134,7 @@ import com.cloud.agent.api.storage.CreateAnswer;
import com.cloud.agent.api.storage.CreateCommand;
import com.cloud.agent.api.storage.CreatePrivateTemplateAnswer;
import com.cloud.agent.api.storage.CreatePrivateTemplateCommand;
+import com.cloud.agent.api.storage.DestroyCommand;
import com.cloud.agent.api.storage.DownloadAnswer;
import com.cloud.agent.api.storage.PrimaryStorageDownloadCommand;
import com.cloud.agent.api.to.StoragePoolTO;
@@ -1116,6 +1117,8 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
return execute((MaintainCommand) cmd);
} else if (cmd instanceof CreateCommand) {
return execute((CreateCommand) cmd);
+ } else if (cmd instanceof DestroyCommand) {
+ return execute((DestroyCommand) cmd);
} else if (cmd instanceof PrimaryStorageDownloadCommand) {
return execute((PrimaryStorageDownloadCommand) cmd);
} else if (cmd instanceof CreatePrivateTemplateCommand) {
@@ -1225,6 +1228,25 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
}
}
}
+
+ public Answer execute(DestroyCommand cmd) {
+ VolumeTO vol = cmd.getVolume();
+
+ StorageVol volume = getVolume(vol.getPath());
+ if (volume == null) {
+ s_logger.debug("Failed to find the volume: " + vol.getPath());
+ return new Answer(cmd, true, "Success");
+ }
+ try {
+ volume.delete(0);
+ volume.free();
+ } catch (LibvirtException e) {
+ s_logger.debug("Failed to delete volume: " + e.toString());
+ return new Answer(cmd, false, e.toString());
+ }
+ return new Answer(cmd, true, "Success");
+ }
+
protected ManageSnapshotAnswer execute(final ManageSnapshotCommand cmd) {
String snapshotName = cmd.getSnapshotName();
String VolPath = cmd.getVolumePath();
From ba50928c3f533f56fe9b50d6e771d69c1306abdc Mon Sep 17 00:00:00 2001
From: edison
Date: Thu, 26 Aug 2010 13:55:59 -0700
Subject: [PATCH 034/235] bug 5936: fix creating template status 5936: closed
fixed
---
.../agent/resource/computing/LibvirtComputingResource.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java
index 90cb53dc497..d867e3c33c3 100644
--- a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java
+++ b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java
@@ -1489,7 +1489,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
String tmpltPath = _mountPoint + File.separator + secondaryStorage.getUUIDString() + templateInstallFolder;
File mpfile = new File(tmpltPath);
if (!mpfile.exists()) {
- mpfile.mkdir();
+ mpfile.mkdirs();
}
Script command = new Script(_createTmplPath, _timeout, s_logger);
From fb592dd34bf0e96e278076e4fd0320f3a98509f0 Mon Sep 17 00:00:00 2001
From: edison
Date: Thu, 26 Aug 2010 16:30:19 -0700
Subject: [PATCH 035/235] fix build
---
.../computing/LibvirtComputingResource.java | 18 +++++++++---------
1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java
index d867e3c33c3..ad7c036fe31 100644
--- a/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java
+++ b/agent/src/com/cloud/agent/resource/computing/LibvirtComputingResource.java
@@ -1231,13 +1231,13 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
public Answer execute(DestroyCommand cmd) {
VolumeTO vol = cmd.getVolume();
-
- StorageVol volume = getVolume(vol.getPath());
- if (volume == null) {
- s_logger.debug("Failed to find the volume: " + vol.getPath());
- return new Answer(cmd, true, "Success");
- }
+
try {
+ StorageVol volume = getVolume(vol.getPath());
+ if (volume == null) {
+ s_logger.debug("Failed to find the volume: " + vol.getPath());
+ return new Answer(cmd, true, "Success");
+ }
volume.delete(0);
volume.free();
} catch (LibvirtException e) {
@@ -1430,7 +1430,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
String templatePath = _mountPoint + File.separator + secondaryPool.getUUIDString() + File.separator + templateInstallFolder;
File f = new File(templatePath);
if (!f.exists()) {
- f.mkdir();
+ f.mkdirs();
}
String tmplPath = templateInstallFolder + File.separator + tmplFileName;
Script command = new Script(_createTmplPath, _timeout, s_logger);
@@ -1704,7 +1704,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
pool.getHostAddress(), pool.getPath(), targetPath);
File tpFile = new File(targetPath);
if (!tpFile.exists()) {
- tpFile.mkdir();
+ tpFile.mkdirs();
}
StoragePool sp = null;
try {
@@ -3366,7 +3366,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv
File logPath = new File("/var/run/cloud");
if (!logPath.exists()) {
- logPath.mkdir();
+ logPath.mkdirs();
}
cleanup_rules_for_dead_vms();
From 8be0a3f70f5996540bbc175b2457eed00d7c18ef Mon Sep 17 00:00:00 2001
From: Kris McQueen
Date: Thu, 26 Aug 2010 16:37:04 -0700
Subject: [PATCH 036/235] Issue 5985: remove the username/removed uniqueness
constraint since (a) usernames need to be unique within a domain but not
accross domains and (b) the contraint isn't really doing anything at this
point. Status 5985: resolved fixed
---
setup/db/create-index-fk.sql | 1 -
setup/db/db-migrate-2.1.3.sql | 2 ++
2 files changed, 2 insertions(+), 1 deletion(-)
create mode 100644 setup/db/db-migrate-2.1.3.sql
diff --git a/setup/db/create-index-fk.sql b/setup/db/create-index-fk.sql
index ad99b33aa47..7de4c557c54 100644
--- a/setup/db/create-index-fk.sql
+++ b/setup/db/create-index-fk.sql
@@ -63,7 +63,6 @@ ALTER TABLE `cloud`.`storage_pool_details` ADD INDEX `i_storage_pool_details__na
ALTER TABLE `cloud`.`user` ADD INDEX `i_user__secret_key_removed`(`secret_key`, `removed`);
ALTER TABLE `cloud`.`user` ADD INDEX `i_user__removed`(`removed`);
-ALTER TABLE `cloud`.`user` ADD UNIQUE `i_user__username__removed`(`username`, `removed`);
ALTER TABLE `cloud`.`user` ADD UNIQUE `i_user__api_key`(`api_key`);
ALTER TABLE `cloud`.`user` ADD CONSTRAINT `fk_user__account_id` FOREIGN KEY `fk_user__account_id` (`account_id`) REFERENCES `account` (`id`) ON DELETE CASCADE;
ALTER TABLE `cloud`.`user` ADD INDEX `i_user__account_id`(`account_id`);
diff --git a/setup/db/db-migrate-2.1.3.sql b/setup/db/db-migrate-2.1.3.sql
new file mode 100644
index 00000000000..c3adf7b3d14
--- /dev/null
+++ b/setup/db/db-migrate-2.1.3.sql
@@ -0,0 +1,2 @@
+ALTER TABLE `cloud`.`user` DROP KEY `i_user__username__removed`;
+
From b5436693f3bc31a319c56816868e48f8649fc894 Mon Sep 17 00:00:00 2001
From: "Manuel Amador (Rudd-O)"
Date: Thu, 26 Aug 2010 19:17:30 -0700
Subject: [PATCH 037/235] Fix build by temporarily re-zoning very cool
incubation software cloud-web-ipallocator to incubation directory until it is
ready for production
---
.../cloud-web-ipallocator.in => incubation/cloud-web-ipallocator} | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename python/{bindir/cloud-web-ipallocator.in => incubation/cloud-web-ipallocator} (100%)
diff --git a/python/bindir/cloud-web-ipallocator.in b/python/incubation/cloud-web-ipallocator
similarity index 100%
rename from python/bindir/cloud-web-ipallocator.in
rename to python/incubation/cloud-web-ipallocator
From e992e8732db463bb76f03195268424b41f134425 Mon Sep 17 00:00:00 2001
From: "Manuel Amador (Rudd-O)"
Date: Thu, 26 Aug 2010 19:11:14 -0700
Subject: [PATCH 038/235] bug 5985: rename hotfix for bug to be consistent with
other migration scripts, and include in fedora / ubuntu packaging
---
cloud.spec | 1 +
debian/cloud-setup.install | 1 +
setup/db/{db-migrate-2.1.3.sql => index-212to213.sql} | 0
3 files changed, 2 insertions(+)
rename setup/db/{db-migrate-2.1.3.sql => index-212to213.sql} (100%)
diff --git a/cloud.spec b/cloud.spec
index 1901f9f1ca7..38750cad530 100644
--- a/cloud.spec
+++ b/cloud.spec
@@ -597,6 +597,7 @@ fi
%{_datadir}/%{name}/setup/server-setup.xml
%{_datadir}/%{name}/setup/data-20to21.sql
%{_datadir}/%{name}/setup/index-20to21.sql
+%{_datadir}/%{name}/setup/index-212to213.sql
%{_datadir}/%{name}/setup/postprocess-20to21.sql
%{_datadir}/%{name}/setup/schema-20to21.sql
%doc README
diff --git a/debian/cloud-setup.install b/debian/cloud-setup.install
index 542cf84199e..c82d530d245 100644
--- a/debian/cloud-setup.install
+++ b/debian/cloud-setup.install
@@ -10,5 +10,6 @@
/usr/share/cloud/setup/server-setup.xml
/usr/share/cloud/setup/data-20to21.sql
/usr/share/cloud/setup/index-20to21.sql
+/usr/share/cloud/setup/index-212to213.sql
/usr/share/cloud/setup/postprocess-20to21.sql
/usr/share/cloud/setup/schema-20to21.sql
diff --git a/setup/db/db-migrate-2.1.3.sql b/setup/db/index-212to213.sql
similarity index 100%
rename from setup/db/db-migrate-2.1.3.sql
rename to setup/db/index-212to213.sql
From cebd1da99c3dbcf80cfdbe5a14b29f9287a510ed Mon Sep 17 00:00:00 2001
From: "Manuel Amador (Rudd-O)"
Date: Thu, 26 Aug 2010 19:15:15 -0700
Subject: [PATCH 039/235] Added support for injecting the VMWare templates
across the board, and in the packages too
---
cloud.spec | 3 +--
debian/cloud-setup.install | 3 +--
setup/bindir/cloud-setup-databases.in | 4 ++--
wscript | 3 +++
4 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/cloud.spec b/cloud.spec
index 38750cad530..a1feac0d697 100644
--- a/cloud.spec
+++ b/cloud.spec
@@ -591,8 +591,7 @@ fi
%{_datadir}/%{name}/setup/create-index-fk.sql
%{_datadir}/%{name}/setup/create-schema.sql
%{_datadir}/%{name}/setup/server-setup.sql
-%{_datadir}/%{name}/setup/templates.kvm.sql
-%{_datadir}/%{name}/setup/templates.xenserver.sql
+%{_datadir}/%{name}/setup/templates.*.sql
%{_datadir}/%{name}/setup/deploy-db-dev.sh
%{_datadir}/%{name}/setup/server-setup.xml
%{_datadir}/%{name}/setup/data-20to21.sql
diff --git a/debian/cloud-setup.install b/debian/cloud-setup.install
index c82d530d245..7d35dbe9929 100644
--- a/debian/cloud-setup.install
+++ b/debian/cloud-setup.install
@@ -4,8 +4,7 @@
/usr/share/cloud/setup/create-index-fk.sql
/usr/share/cloud/setup/create-schema.sql
/usr/share/cloud/setup/server-setup.sql
-/usr/share/cloud/setup/templates.kvm.sql
-/usr/share/cloud/setup/templates.xenserver.sql
+/usr/share/cloud/setup/templates.*.sql
/usr/share/cloud/setup/deploy-db-dev.sh
/usr/share/cloud/setup/server-setup.xml
/usr/share/cloud/setup/data-20to21.sql
diff --git a/setup/bindir/cloud-setup-databases.in b/setup/bindir/cloud-setup-databases.in
index d1d0154916d..6c34575fcc0 100755
--- a/setup/bindir/cloud-setup-databases.in
+++ b/setup/bindir/cloud-setup-databases.in
@@ -43,7 +43,7 @@ except ImportError:
#---------------------- option parsing and command line checks ------------------------
-usage = """%prog user:password@mysqlhost:port [--deploy-as=rootuser:rootpassword] [--auto=/path/to/server-setup.xml]
+usage = """%prog user:password@mysqlhost:port [--deploy-as=rootuser:rootpassword] [--auto=/path/to/server-setup.xml]
This command sets up the CloudStack Management Server and CloudStack Usage Server database configuration (connection credentials and host information) based on the first argument.
@@ -224,7 +224,7 @@ def setupconfigfile(fn,myipaddr,username,password,host,port):
(options, args) = parser.parse_args()
if len(args) != 2: e("Wrong number of arguments")
-if args[1] not in ["xenserver","kvm"]: e("You need to specify either xenserver or kvm after the database credentials")
+if args[1] not in ["xenserver","kvm","vmware"]: e("You need to specify either xenserver or kvm or vmware after the database credentials")
virttech = args[1]
user,password,host,port= get_creds(parser,options,args)
diff --git a/wscript b/wscript
index a9d85e31624..1c212ab0438 100644
--- a/wscript
+++ b/wscript
@@ -759,6 +759,9 @@ def deploydb_xenserver(ctx):
def deploydb_kvm(ctx):
"""re-deploys the database using the MySQL connection information and the KVM templates.sql"""
return deploydb(ctx,"kvm")
+def deploydb_vmware(ctx):
+ """re-deploys the database using the MySQL connection information and the KVM templates.sql"""
+ return deploydb(ctx,"vmware")
def run(args):
"""runs the management server"""
From 7875de73038d70d8775a02b3b0187e9c85317a3f Mon Sep 17 00:00:00 2001
From: "Manuel Amador (Rudd-O)"
Date: Thu, 26 Aug 2010 18:58:38 -0700
Subject: [PATCH 040/235] Build ISO images for xenserver patches AND Fedora /
CentOS packaging fix for the ISO generation.
Build ISO images for xenserver patches
Fedora / CentOS packaging fix for the ISO generation.
---
cloud.spec | 34 +----------------
wscript_build | 101 ++++++++++++++++++++++++++++++++++++++------------
2 files changed, 79 insertions(+), 56 deletions(-)
diff --git a/cloud.spec b/cloud.spec
index a1feac0d697..30f8a0b5588 100644
--- a/cloud.spec
+++ b/cloud.spec
@@ -481,46 +481,17 @@ fi
%doc README.html
%doc debian/copyright
-%if %{_premium}
-
%files agent-scripts
%defattr(-,root,root,-)
%{_libdir}/%{name}/agent/scripts/*
%{_libdir}/%{name}/agent/vms/systemvm.zip
+%{_libdir}/%{name}/agent/vms/systemvm.iso
%doc README
%doc INSTALL
%doc HACKING
%doc README.html
%doc debian/copyright
-%else
-
-%files agent-scripts
-%defattr(-,root,root,-)
-%{_libdir}/%{name}/agent/scripts/installer/*
-%{_libdir}/%{name}/agent/scripts/network/domr/*.sh
-%{_libdir}/%{name}/agent/scripts/storage/*.sh
-%{_libdir}/%{name}/agent/scripts/storage/zfs/*
-%{_libdir}/%{name}/agent/scripts/storage/qcow2/*
-%{_libdir}/%{name}/agent/scripts/storage/secondary/*
-%{_libdir}/%{name}/agent/scripts/util/*
-%{_libdir}/%{name}/agent/scripts/vm/*.sh
-%{_libdir}/%{name}/agent/scripts/vm/storage/nfs/*
-%{_libdir}/%{name}/agent/scripts/vm/storage/iscsi/*
-%{_libdir}/%{name}/agent/scripts/vm/network/*
-%{_libdir}/%{name}/agent/scripts/vm/hypervisor/*.sh
-%{_libdir}/%{name}/agent/scripts/vm/hypervisor/kvm/*
-%{_libdir}/%{name}/agent/scripts/vm/hypervisor/xen/*
-%{_libdir}/%{name}/agent/vms/systemvm.zip
-%{_libdir}/%{name}/agent/scripts/vm/hypervisor/xenserver/*
-%doc README
-%doc INSTALL
-%doc HACKING
-%doc README.html
-%doc debian/copyright
-
-%endif
-
%files daemonize
%defattr(-,root,root,-)
%attr(755,root,root) %{_bindir}/%{name}-daemonize
@@ -724,8 +695,7 @@ fi
%{_javadir}/%{name}-server-extras.jar
%{_sysconfdir}/%{name}/management/commands-ext.properties
%{_sysconfdir}/%{name}/management/components-premium.xml
-%{_libdir}/%{name}/agent/scripts/vm/hypervisor/xenserver/*
-%{_libdir}/%{name}/agent/vms/systemvm-premium.zip
+%{_libdir}/%{name}/agent/vms/systemvm-premium.iso
%{_datadir}/%{name}/setup/create-database-premium.sql
%{_datadir}/%{name}/setup/create-schema-premium.sql
%doc README
diff --git a/wscript_build b/wscript_build
index a964c9040dd..9d36a3ca81a 100644
--- a/wscript_build
+++ b/wscript_build
@@ -229,21 +229,22 @@ def tar_up(task):
z.close()
return 0
-if bld.env.DISTRO != "Windows":
- for virttech in [ _basename(x) for x in _glob(_join("patches","*")) ]:
- if virttech == "shared":
- continue
- patchfiles = filelist('patches/%s/** patches/shared/**'%virttech,src=True,bld=True,dir=False,flat=True)
- tgen = bld(
- rule = tar_up,
- source = patchfiles,
- target = '%s-patch.tgz'%virttech,
- name = '%s-patch_tgz'%virttech,
- root = "patches/%s"%virttech,
- rename = lambda x: re.sub(".subst$","",x),
- after = 'patchsubst',
- )
- bld.process_after(tgen)
+for virttech in [ _basename(x) for x in _glob(_join("patches","*")) ]:
+ if virttech == "shared":
+ continue
+ patchfiles = filelist('patches/%s/** patches/shared/**'%virttech,src=True,bld=True,dir=False,flat=True)
+ tgen = bld(
+ rule = tar_up,
+ source = patchfiles,
+ target = '%s-patch.tgz'%virttech,
+ name = '%s-patch_tgz'%virttech,
+ root = "patches/%s"%virttech,
+ rename = lambda x: re.sub(".subst$","",x),
+ after = 'patchsubst',
+ )
+ bld.process_after(tgen)
+ if virttech != "xenserver":
+ # xenserver uses the patch.tgz file later to make an ISO, so we do not need to install it
bld.install_as("${AGENTLIBDIR}/scripts/vm/hypervisor/%s/patch.tgz"%virttech, "%s-patch.tgz"%virttech)
# ================== End creation of patch.tgz's ====================
@@ -338,6 +339,8 @@ def zip_up(task):
z.close()
return 0
+bld.path.ensure_dir_node_from_path("target/oss")
+bld.path.ensure_dir_node_from_path("target/premium")
if bld.env.DISTRO not in ["Windows","Mac"]:
tgen = bld(
rule = copydeps,
@@ -348,30 +351,80 @@ if bld.env.DISTRO not in ["Windows","Mac"]:
tgen = bld(
rule = zip_up,
source = " ".join( [sources,artifacts,deps,systems] ),
- target = 'systemvm.zip',
+ target = 'target/oss/systemvm.zip',
name = 'systemvm_zip',
- after = 'copydeps getsystemjars runant',
+ after = 'getsystemjars runant',
)
bld.process_after(tgen)
+ bld.install_files("${AGENTLIBDIR}/vms", "target/oss/systemvm.zip")
+
if buildpremium:
tgen = bld(
rule = zip_up,
source = " ".join( [premiumsources,premiumartifacts,thirdparties] ),
- target = 'systemvm-premium.zip',
+ target = 'target/premium/systemvm.zip',
name = 'systemvm-premium_zip',
after = 'runant',
)
bld.process_after(tgen)
-
-if bld.env.DISTRO not in [ "Windows", "Mac"]:
- bld.install_files("${AGENTLIBDIR}/vms", "systemvm.zip")
-
-if buildpremium:
- bld.install_files("${AGENTLIBDIR}/vms", "systemvm-premium.zip")
+ #no need to install the premium one, we have ISOs below
+ #bld.install_files("${AGENTLIBDIR}/vms", "systemvm-premium.zip")
# ================== End systemvm patch creation ====================
+# ================== systemvm ISO creation ====================
+
+if bld.env.DISTRO not in ["Windows","Mac"]: # mkisofs only on windows
+
+ def iso_up(task):
+ tgt = task.outputs[0].bldpath(task.env)
+ if _exists(tgt): _unlink(tgt)
+ inps = []
+ for inp in task.inputs:
+ if inp.id&3==Node.BUILD:
+ src = inp.bldpath(task.env)
+ srcname = src
+ srcname = "/".join(srcname.split("/")[1:]) # chop off default/
+ else:
+ src = inp.srcpath(task.env)
+ srcname = src
+ srcname = "/".join(srcname.split("/")[1:]) # chop off ../
+ # post-process the paths
+ inps.append(src)
+ return Utils.exec_command(
+ [
+ #"echo",
+ "mkisofs",
+ "-quiet",
+ "-r",
+ "-o",tgt,
+ ] + inps)
+
+ tgen = bld(
+ rule = iso_up,
+ source = "xenserver-patch.tgz target/oss/systemvm.zip",
+ target = 'target/oss/systemvm.iso',
+ name = 'systemvm_iso',
+ after = 'systemvm_zip xenserver-patch_tgz',
+ )
+ bld.process_after(tgen)
+ bld.install_as("${AGENTLIBDIR}/vms/systemvm.iso", "target/oss/systemvm.iso")
+
+ if buildpremium:
+ tgen = bld(
+ rule = iso_up,
+ source = "xenserver-patch.tgz target/premium/systemvm.zip",
+ target = 'target/premium/systemvm.iso',
+ name = 'systemvm-premium_iso',
+ after = 'systemvm-premium_zip xenserver-patch_tgz',
+ )
+ bld.process_after(tgen)
+ bld.install_as("${AGENTLIBDIR}/vms/systemvm-premium.iso", "target/premium/systemvm.iso")
+
+# ================== End systemvm ISO creation ====================
+
+
# =================== Empty directory / symlink creation on install target ====================
# 7. make log and cache dirs (this actually runs first)
From 0e326e853c31a7eb380c29bd8dddbc03c61f2a42 Mon Sep 17 00:00:00 2001
From: kishan
Date: Fri, 27 Aug 2010 18:02:23 +0530
Subject: [PATCH 041/235] bug 5900: Added events for disk offering
---
core/src/com/cloud/event/EventTypes.java | 5 ++++
.../com/cloud/server/ManagementServer.java | 4 +--
.../api/commands/CreateDiskOfferingCmd.java | 9 ++++--
.../api/commands/DeleteDiskOfferingCmd.java | 13 +++++++--
.../configuration/ConfigurationManager.java | 9 +++++-
.../ConfigurationManagerImpl.java | 29 +++++++++++++++++--
.../cloud/server/ConfigurationServerImpl.java | 8 ++---
.../cloud/server/ManagementServerImpl.java | 8 ++---
8 files changed, 66 insertions(+), 19 deletions(-)
diff --git a/core/src/com/cloud/event/EventTypes.java b/core/src/com/cloud/event/EventTypes.java
index 4ba66ee4762..e25f73dad39 100644
--- a/core/src/com/cloud/event/EventTypes.java
+++ b/core/src/com/cloud/event/EventTypes.java
@@ -118,6 +118,11 @@ public class EventTypes {
public static final String EVENT_SERVICE_OFFERING_EDIT = "SERVICE.OFFERING.EDIT";
public static final String EVENT_SERVICE_OFFERING_DELETE = "SERVICE.OFFERING.DELETE";
+ // Disk Offerings
+ public static final String EVENT_DISK_OFFERING_CREATE = "DISK.OFFERING.CREATE";
+ public static final String EVENT_DISK_OFFERING_EDIT = "DISK.OFFERING.EDIT";
+ public static final String EVENT_DISK_OFFERING_DELETE = "DISK.OFFERING.DELETE";
+
// Pods
public static final String EVENT_POD_CREATE = "POD.CREATE";
public static final String EVENT_POD_EDIT = "POD.EDIT";
diff --git a/core/src/com/cloud/server/ManagementServer.java b/core/src/com/cloud/server/ManagementServer.java
index 85a3115ec07..d3d781b2716 100644
--- a/core/src/com/cloud/server/ManagementServer.java
+++ b/core/src/com/cloud/server/ManagementServer.java
@@ -1836,14 +1836,14 @@ public interface ManagementServer {
* @param tags Comma separated string to indicate special tags for the disk offering.
* @return the created disk offering, null if failed to create
*/
- DiskOfferingVO createDiskOffering(long domainId, String name, String description, int numGibibytes, String tags) throws InvalidParameterValueException;
+ DiskOfferingVO createDiskOffering(long userId, long domainId, String name, String description, int numGibibytes, String tags) throws InvalidParameterValueException;
/**
* Delete a disk offering
* @param id id of the disk offering to delete
* @return true if deleted, false otherwise
*/
- boolean deleteDiskOffering(long id);
+ boolean deleteDiskOffering(long userId, long id);
/**
* Update a disk offering
diff --git a/server/src/com/cloud/api/commands/CreateDiskOfferingCmd.java b/server/src/com/cloud/api/commands/CreateDiskOfferingCmd.java
index a1e1099c079..b77c51ba7bb 100644
--- a/server/src/com/cloud/api/commands/CreateDiskOfferingCmd.java
+++ b/server/src/com/cloud/api/commands/CreateDiskOfferingCmd.java
@@ -29,6 +29,7 @@ import com.cloud.api.ServerApiException;
import com.cloud.domain.DomainVO;
import com.cloud.exception.InvalidParameterValueException;
import com.cloud.storage.DiskOfferingVO;
+import com.cloud.user.User;
import com.cloud.utils.Pair;
public class CreateDiskOfferingCmd extends BaseCmd {
@@ -61,7 +62,7 @@ public class CreateDiskOfferingCmd extends BaseCmd {
public List> execute(Map params) {
// FIXME: add domain-private disk offerings
// Account account = (Account)params.get(BaseCmd.Properties.ACCOUNT_OBJ.getName());
-// Long userId = (Long)params.get(BaseCmd.Properties.USER_ID.getName());
+ Long userId = (Long)params.get(BaseCmd.Properties.USER_ID.getName());
Long domainId = (Long)params.get(BaseCmd.Properties.DOMAIN_ID.getName());
String name = (String)params.get(BaseCmd.Properties.NAME.getName());
String displayText = (String)params.get(BaseCmd.Properties.DISPLAY_TEXT.getName());
@@ -74,11 +75,15 @@ public class CreateDiskOfferingCmd extends BaseCmd {
// }
if (domainId == null) {
domainId = DomainVO.ROOT_DOMAIN;
+ }
+
+ if (userId == null) {
+ userId = Long.valueOf(User.UID_SYSTEM);
}
DiskOfferingVO diskOffering = null;
try {
- diskOffering = getManagementServer().createDiskOffering(domainId.longValue(), name, displayText, numGB.intValue(),tags);
+ diskOffering = getManagementServer().createDiskOffering(userId, domainId.longValue(), name, displayText, numGB.intValue(),tags);
} catch (InvalidParameterValueException ex) {
throw new ServerApiException (BaseCmd.VM_INVALID_PARAM_ERROR, ex.getMessage());
}
diff --git a/server/src/com/cloud/api/commands/DeleteDiskOfferingCmd.java b/server/src/com/cloud/api/commands/DeleteDiskOfferingCmd.java
index aea19711107..5c00750146f 100644
--- a/server/src/com/cloud/api/commands/DeleteDiskOfferingCmd.java
+++ b/server/src/com/cloud/api/commands/DeleteDiskOfferingCmd.java
@@ -27,6 +27,7 @@ import org.apache.log4j.Logger;
import com.cloud.api.BaseCmd;
import com.cloud.api.ServerApiException;
import com.cloud.storage.DiskOfferingVO;
+import com.cloud.user.User;
import com.cloud.utils.Pair;
public class DeleteDiskOfferingCmd extends BaseCmd {
@@ -36,7 +37,8 @@ public class DeleteDiskOfferingCmd extends BaseCmd {
private static final List> s_properties = new ArrayList>();
static {
- s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE));
+ s_properties.add(new Pair(BaseCmd.Properties.ID, Boolean.TRUE));
+ s_properties.add(new Pair(BaseCmd.Properties.USER_ID, Boolean.FALSE));
}
public String getName() {
@@ -48,7 +50,12 @@ public class DeleteDiskOfferingCmd extends BaseCmd {
@Override
public List> execute(Map params) {
- Long id = (Long)params.get(BaseCmd.Properties.ID.getName());
+ Long id = (Long)params.get(BaseCmd.Properties.ID.getName());
+ Long userId = (Long)params.get(BaseCmd.Properties.USER_ID.getName());
+
+ if (userId == null) {
+ userId = Long.valueOf(User.UID_SYSTEM);
+ }
//verify input parameters
DiskOfferingVO disk = getManagementServer().findDiskOfferingById(id);
@@ -56,7 +63,7 @@ public class DeleteDiskOfferingCmd extends BaseCmd {
throw new ServerApiException(BaseCmd.PARAM_ERROR, "unable to find a disk offering with id " + id);
}
- boolean result = getManagementServer().deleteDiskOffering(id);
+ boolean result = getManagementServer().deleteDiskOffering(userId, id);
List> returnValues = new ArrayList>();
returnValues.add(new Pair(BaseCmd.Properties.SUCCESS.getName(), Boolean.valueOf(result).toString()));
diff --git a/server/src/com/cloud/configuration/ConfigurationManager.java b/server/src/com/cloud/configuration/ConfigurationManager.java
index 2acf9ee9e27..f7f8e780541 100644
--- a/server/src/com/cloud/configuration/ConfigurationManager.java
+++ b/server/src/com/cloud/configuration/ConfigurationManager.java
@@ -99,7 +99,14 @@ public interface ConfigurationManager extends Manager {
* @param size
* @return ID
*/
- DiskOfferingVO createDiskOffering(long domainId, String name, String description, int numGibibytes, String tags);
+ DiskOfferingVO createDiskOffering(long userId, long domainId, String name, String description, int numGibibytes, String tags);
+
+ /**
+ * Deletes a disk offering
+ * @param userId
+ * @param diskOfferingId
+ */
+ boolean deleteDiskOffering(long userId, long diskOfferingId);
/**
* Creates a new pod
diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
index 9978cee29b1..3edff34e803 100644
--- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
+++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java
@@ -914,6 +914,8 @@ public class ConfigurationManagerImpl implements ConfigurationManager {
}
if (_diskOfferingDao.update(diskOfferingId, diskOffering)) {
+ saveConfigurationEvent(userId, null, EventTypes.EVENT_DISK_OFFERING_EDIT, "Successfully updated disk offering with name: " + diskOffering.getName() + ".", "doId=" + diskOffering.getId(), "name=" + diskOffering.getName(),
+ "displayText=" + diskOffering.getDisplayText(), "diskSize=" + diskOffering.getDiskSize(),"tags=" + diskOffering.getTags());
return _diskOfferingDao.findById(diskOfferingId);
} else {
return null;
@@ -924,7 +926,7 @@ public class ConfigurationManagerImpl implements ConfigurationManager {
ServiceOfferingVO offering = _serviceOfferingDao.findById(serviceOfferingId);
if (_serviceOfferingDao.remove(serviceOfferingId)) {
- saveConfigurationEvent(userId, null, EventTypes.EVENT_SERVICE_OFFERING_EDIT, "Successfully deleted service offering with name: " + offering.getName(), "soId=" + serviceOfferingId, "name=" + offering.getName(),
+ saveConfigurationEvent(userId, null, EventTypes.EVENT_SERVICE_OFFERING_DELETE, "Successfully deleted service offering with name: " + offering.getName(), "soId=" + serviceOfferingId, "name=" + offering.getName(),
"displayText=" + offering.getDisplayText(), "offerHA=" + offering.getOfferHA(), "useVirtualNetwork=" + (offering.getGuestIpType() == NetworkOffering.GuestIpType.Virtualized));
return true;
} else {
@@ -932,11 +934,32 @@ public class ConfigurationManagerImpl implements ConfigurationManager {
}
}
- public DiskOfferingVO createDiskOffering(long domainId, String name, String description, int numGibibytes, String tags) {
+ public DiskOfferingVO createDiskOffering(long userId, long domainId, String name, String description, int numGibibytes, String tags) {
long diskSize = numGibibytes * 1024;
tags = cleanupTags(tags);
DiskOfferingVO newDiskOffering = new DiskOfferingVO(domainId, name, description, diskSize,tags);
- return _diskOfferingDao.persist(newDiskOffering);
+
+ if ((newDiskOffering = _diskOfferingDao.persist(newDiskOffering)) != null) {
+ saveConfigurationEvent(userId, null, EventTypes.EVENT_DISK_OFFERING_CREATE, "Successfully created new disk offering with name: "
+ + name + ".", "doId=" + newDiskOffering.getId(), "name=" + name, "diskSize=" + diskSize, "description="
+ + description, "tags=" + tags);
+ return newDiskOffering;
+ } else {
+ return null;
+ }
+ }
+
+ public boolean deleteDiskOffering(long userId, long diskOfferingId) {
+ DiskOfferingVO offering = _diskOfferingDao.findById(diskOfferingId);
+
+ if (_diskOfferingDao.remove(diskOfferingId)) {
+ saveConfigurationEvent(userId, null, EventTypes.EVENT_DISK_OFFERING_DELETE, "Successfully deleted disk offering with name: "
+ + offering.getName(), "doId=" + offering.getId(), "name=" + offering.getName(), "diskSize=" + offering.getDiskSize(),
+ "description=" + offering.getDisplayText(), "tags=" + offering.getTags());
+ return true;
+ } else {
+ return false;
+ }
}
public String changePrivateIPRange(boolean add, long podId, String startIP, String endIP) throws InvalidParameterValueException {
diff --git a/server/src/com/cloud/server/ConfigurationServerImpl.java b/server/src/com/cloud/server/ConfigurationServerImpl.java
index b07169a1a62..8a16cc25108 100644
--- a/server/src/com/cloud/server/ConfigurationServerImpl.java
+++ b/server/src/com/cloud/server/ConfigurationServerImpl.java
@@ -142,10 +142,10 @@ public class ConfigurationServerImpl implements ConfigurationServer {
_configMgr.createServiceOffering(User.UID_SYSTEM, "Small Instance, Virtual Networking", 1, 512, 500, "Small Instance, Virtual Networking, $0.05 per hour", false, false, true, null);
_configMgr.createServiceOffering(User.UID_SYSTEM, "Medium Instance, Virtual Networking", 1, 1024, 1000, "Medium Instance, Virtual Networking, $0.10 per hour", false, false, true, null);
// Save default disk offerings
- _configMgr.createDiskOffering(DomainVO.ROOT_DOMAIN, "Small", "Small Disk, 5 GB", 5, null);
- _configMgr.createDiskOffering(DomainVO.ROOT_DOMAIN, "Medium", "Medium Disk, 20 GB", 20, null);
- _configMgr.createDiskOffering(DomainVO.ROOT_DOMAIN, "Large", "Large Disk, 100 GB", 100, null);
- _configMgr.createDiskOffering(DomainVO.ROOT_DOMAIN, "Private", "Private Disk", 0, null);
+ _configMgr.createDiskOffering(User.UID_SYSTEM, DomainVO.ROOT_DOMAIN, "Small", "Small Disk, 5 GB", 5, null);
+ _configMgr.createDiskOffering(User.UID_SYSTEM, DomainVO.ROOT_DOMAIN, "Medium", "Medium Disk, 20 GB", 20, null);
+ _configMgr.createDiskOffering(User.UID_SYSTEM, DomainVO.ROOT_DOMAIN, "Large", "Large Disk, 100 GB", 100, null);
+ _configMgr.createDiskOffering(User.UID_SYSTEM, DomainVO.ROOT_DOMAIN, "Private", "Private Disk", 0, null);
//Add default manual snapshot policy
SnapshotPolicyVO snapPolicy = new SnapshotPolicyVO(0L, "00", "GMT", (short)4, 0);
diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java
index f83a482ac78..a3c3a86b9a4 100644
--- a/server/src/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/com/cloud/server/ManagementServerImpl.java
@@ -6836,14 +6836,14 @@ public class ManagementServerImpl implements ManagementServer {
}
@Override
- public DiskOfferingVO createDiskOffering(long domainId, String name, String description, int numGibibytes, String tags) throws InvalidParameterValueException {
+ public DiskOfferingVO createDiskOffering(long userId, long domainId, String name, String description, int numGibibytes, String tags) throws InvalidParameterValueException {
if (numGibibytes!=0 && numGibibytes < 1) {
throw new InvalidParameterValueException("Please specify a disk size of at least 1 Gb.");
} else if (numGibibytes > _maxVolumeSizeInGb) {
throw new InvalidParameterValueException("The maximum size for a disk is " + _maxVolumeSizeInGb + " Gb.");
}
- return _configMgr.createDiskOffering(domainId, name, description, numGibibytes, tags);
+ return _configMgr.createDiskOffering(userId, domainId, name, description, numGibibytes, tags);
}
@Override
@@ -6852,8 +6852,8 @@ public class ManagementServerImpl implements ManagementServer {
}
@Override
- public boolean deleteDiskOffering(long id) {
- return _diskOfferingDao.remove(Long.valueOf(id));
+ public boolean deleteDiskOffering(long userId, long id) {
+ return _configMgr.deleteDiskOffering(userId, id);
}
@Override
From 2164d07b6152aca2c33771e0d60a7197844882f8 Mon Sep 17 00:00:00 2001
From: Chiradeep Vittal
Date: Fri, 27 Aug 2010 09:38:33 -0700
Subject: [PATCH 042/235] Make the vm smaller
---
tools/systemvm/debian/buildsystemvm.sh | 303 +++++++++++++++++++++++++
1 file changed, 303 insertions(+)
create mode 100755 tools/systemvm/debian/buildsystemvm.sh
diff --git a/tools/systemvm/debian/buildsystemvm.sh b/tools/systemvm/debian/buildsystemvm.sh
new file mode 100755
index 00000000000..409883d0214
--- /dev/null
+++ b/tools/systemvm/debian/buildsystemvm.sh
@@ -0,0 +1,303 @@
+#!/bin/bash
+
+IMAGENAME=systemvm
+LOCATION=/var/lib/images/systemvm2
+PASSWORD=password
+APT_PROXY=
+HOSTNAME=systemvm
+SIZE=2000
+DEBIAN_MIRROR=ftp.us.debian.org/debian
+MINIMIZE=true
+
+baseimage() {
+ mkdir -p $LOCATION
+ dd if=/dev/zero of=$IMAGELOC bs=1M seek=$((SIZE - 1)) count=1
+ loopdev=$(losetup -f)
+ losetup $loopdev $IMAGELOC
+ parted $loopdev -s 'mklabel msdos'
+ parted $loopdev -s 'mkpart primary ext3 512B 2097151000B'
+ losetup -d $loopdev
+ loopdev=$(losetup --show -o 512 -f $IMAGELOC )
+ mkfs.ext3 -L ROOT $loopdev
+ mkdir -p $MOUNTPOINT
+ tune2fs -c 100 -i 0 $loopdev
+ losetup -d $loopdev
+
+ mount -o loop,offset=512 $IMAGELOC $MOUNTPOINT
+
+ #debootstrap --variant=minbase --keyring=/usr/share/keyrings/debian-archive-keyring.gpg squeeze $MOUNTPOINT http://${APT_PROXY}${DEBIAN_MIRROR}
+ debootstrap --variant=minbase --arch=i386 squeeze $MOUNTPOINT http://${APT_PROXY}${DEBIAN_MIRROR}
+}
+
+
+fixapt() {
+ if [ "$APT_PROXY" != "" ]; then
+ cat >> etc/apt/apt.conf.d/01proxy << EOF
+Acquire::http::Proxy "http://${APT_PROXY}";
+EOF
+ fi
+
+ cat > etc/apt/sources.list << EOF
+deb http://ftp.us.debian.org/debian/ squeeze main non-free
+deb-src http://ftp.us.debian.org/debian/ squeeze main non-free
+
+deb http://security.debian.org/ squeeze/updates main
+deb-src http://security.debian.org/ squeeze/updates main
+
+deb http://volatile.debian.org/debian-volatile squeeze/volatile main
+deb-src http://volatile.debian.org/debian-volatile squeeze/volatile main
+
+deb http://ftp.us.debian.org/debian testing main contrib non-free
+EOF
+
+ cat >> etc/apt/apt.conf << EOF
+APT::Default-Release "stable";
+EOF
+
+ cat >> etc/apt/preferences << EOF
+Package: *
+Pin: release o=Debian,a=stable
+Pin-Priority: 900
+
+Package: *
+Pin: release o=Debian,a=testing
+Pin-Priority: 400
+EOF
+
+ #apt-key exportall | chroot . apt-key add - &&
+ chroot . apt-get update &&
+ echo "Apt::Install-Recommends 0;" > etc/apt/apt.conf.d/local-recommends
+
+ cat >> usr/sbin/policy-rc.d << EOF
+#!/bin/sh
+exit 101
+EOF
+ chmod a+x usr/sbin/policy-rc.d
+
+ cat >> etc/default/locale << EOF
+LANG=en_US.UTF-8
+LC_ALL=en_US.UTF-8
+EOF
+
+ cat >> etc/locale.gen << EOF
+en_US.UTF-8 UTF-8
+EOF
+
+ DEBIAN_FRONTEND=noninteractive
+ DEBIAN_PRIORITY=critical
+ export DEBIAN_FRONTEND DEBIAN_PRIORITY
+ chroot . dpkg-reconfigure debconf --frontend=noninteractive
+ chroot . apt-get -q -y install locales
+}
+
+network() {
+
+ echo "$HOSTNAME" > etc/hostname &&
+ cat > etc/hosts << EOF
+127.0.0.1 localhost
+# The following lines are desirable for IPv6 capable hosts
+::1 localhost ip6-localhost ip6-loopback
+fe00::0 ip6-localnet
+ff00::0 ip6-mcastprefix
+ff02::1 ip6-allnodes
+ff02::2 ip6-allrouters
+ff02::3 ip6-allhosts
+EOF
+
+ cat >> etc/network/interfaces << EOF
+auto lo
+iface lo inet loopback
+
+# The primary network interface
+allow-hotplug eth0
+iface eth0 inet dhcp
+
+EOF
+}
+
+install_kernel() {
+ DEBIAN_FRONTEND=noninteractive
+ DEBIAN_PRIORITY=critical
+ export DEBIAN_FRONTEND DEBIAN_PRIORITY
+
+ chroot . apt-get -qq -y --force-yes install grub &&
+ cp -av usr/lib/grub/i386-pc boot/grub
+ #for some reason apt-get install grub does not install grub/stage1 etc
+ loopd=$(losetup -f --show $1)
+ grub-install $loopd --root-directory=$MOUNTPOINT
+ losetup -d $loopd
+ grub << EOF &&
+device (hd0) $1
+root (hd0,0)
+setup (hd0)
+quit
+EOF
+ # install a kernel image
+ cat > etc/kernel-img.conf << EOF &&
+do_symlinks = yes
+link_in_boot = yes
+do_initrd = yes
+EOF
+ chroot . apt-get install -qq -y --force-yes linux-image-686-bigmem
+ cat >> etc/kernel-img.conf << EOF
+postinst_hook = /usr/sbin/update-grub
+postrm_hook = /usr/sbin/update-grub
+EOF
+}
+
+
+fixgrub() {
+ cat > boot/grub/menu.lst << EOF
+default 0
+timeout 2
+color cyan/blue white/blue
+
+### BEGIN AUTOMAGIC KERNELS LIST
+# kopt=root=LABEL=ROOT ro
+
+## ## End Default Options ##
+title Debian GNU/Linux, kernel 2.6.32-5-686-bigmem
+root (hd0,0)
+kernel /boot/vmlinuz-2.6.32-5-686-bigmem root=LABEL=ROOT ro console=tty0 xencons=ttyS0,115200 console=hvc0 quiet
+initrd /boot/initrd.img-2.6.32-5-686-bigmem
+
+### END DEBIAN AUTOMAGIC KERNELS LIST
+EOF
+ (cd boot/grub; ln -s menu.lst grub.conf)
+}
+
+fixinittab() {
+ cat >> etc/inittab << EOF
+
+vc:2345:respawn:/sbin/getty 38400 hvc0
+EOF
+}
+
+fixfstab() {
+ cat > etc/fstab << EOF
+#
+proc /proc proc defaults 0 0
+LABEL=ROOT / ext3 errors=remount-ro 0 1
+EOF
+}
+
+fixacpid() {
+ cat >> etc/acpi/events/power << EOF
+event=button/power.*
+action=/usr/local/sbin/power.sh "%e"
+EOF
+ cat >> usr/local/sbin/power.sh << EOF
+#!/bin/bash
+/sbin/poweroff
+EOF
+ chmod a+x usr/local/sbin/power.sh
+}
+
+packages() {
+ DEBIAN_FRONTEND=noninteractive
+ DEBIAN_PRIORITY=critical
+ DEBCONF_DB_OVERRIDE=’File{/root/config.dat}’
+ export DEBIAN_FRONTEND DEBIAN_PRIORITY DEBCONF_DB_OVERRIDE
+
+ chroot . apt-get --no-install-recommends -q -y --force-yes install rsyslog chkconfig insserv net-tools ifupdown vim-tiny netbase iptables openssh-server grub e2fsprogs dhcp3-client dnsmasq tcpdump socat wget apache2 python2.5 bzip2 sed gawk diff grep gzip less tar telnet xl2tpd traceroute openswan psmisc
+
+ chroot . apt-get --no-install-recommends -q -y --force-yes -t backports install haproxy nfs-common
+
+ echo "***** getting additional modules *********"
+ chroot . apt-get --no-install-recommends -q -y --force-yes install iproute acpid iptables-persistent
+
+ echo "***** getting sun jre 6*********"
+ DEBIAN_FRONTEND=readline
+ export DEBIAN_FRONTEND
+ chroot . echo sun-java6-jdk shared/accepted-sun-dlj-v1-1 boolean true | debconf-set-selections
+ chroot . apt-get --no-install-recommends -q -y install sun-java6-jre
+
+}
+
+password() {
+ chroot . echo "root:$PASSWORD" | chroot . chpasswd
+}
+
+cleanup() {
+ rm -f usr/sbin/policy-rc.d
+ rm -f etc/apt/apt.conf.d/01proxy
+
+ if [ "$MINIMIZE" == "true" ]
+ then
+ rm -rf var/cache/apt/*
+ rm -rf var/lib/apt/*
+ rm -rf usr/share/locale/[a-d]*
+ rm -rf usr/share/locale/[f-z]*
+ rm -rf usr/share/doc/*
+ fi
+}
+
+mkdir -p $IMAGENAME
+mkdir -p $LOCATION
+MOUNTPOINT=/mnt/$IMAGENAME/
+IMAGELOC=$LOCATION/$IMAGENAME.img
+scriptdir=$(dirname $PWD/$0)
+
+rm -f $IMAGELOC
+
+echo "*************INSTALLING BASEIMAGE********************"
+baseimage
+
+cp $scriptdir/config.dat $MOUNTPOINT/root/
+cd $MOUNTPOINT
+
+mount -o bind /proc $MOUNTPOINT/proc
+mount -o bind /dev $MOUNTPOINT/dev
+
+echo "*************CONFIGURING APT********************"
+fixapt
+echo "*************DONE CONFIGURING APT********************"
+
+echo "*************CONFIGURING NETWORK********************"
+network
+echo "*************DONE CONFIGURING NETWORK********************"
+
+echo "*************INSTALLING KERNEL********************"
+install_kernel $IMAGELOC
+echo "*************DONE INSTALLING KERNEL********************"
+
+echo "*************CONFIGURING GRUB********************"
+fixgrub $IMAGELOC
+echo "*************DONE CONFIGURING GRUB********************"
+
+
+echo "*************CONFIGURING INITTAB********************"
+fixinittab
+echo "*************DONE CONFIGURING INITTAB********************"
+
+echo "*************CONFIGURING FSTAB********************"
+fixfstab
+echo "*************DONE CONFIGURING FSTAB********************"
+
+echo "*************CONFIGURING ACPID********************"
+fixacpid
+echo "*************DONE CONFIGURING ACPID********************"
+
+#cp etc/inittab etc/inittab.hvm
+#cp $scriptdir/inittab.xen etc/inittab.xen
+#cp $scriptdir/inittab.xen etc/inittab
+#cp $scriptdir/fstab.xen etc/fstab.xen
+#cp $scriptdir/fstab.xen etc/fstab
+#cp $scriptdir/fstab etc/fstab
+
+echo "*************INSTALLING PACKAGES********************"
+packages
+echo "*************DONE INSTALLING PACKAGES********************"
+
+echo "*************CONFIGURING PASSWORD********************"
+password
+
+echo "*************CLEANING UP********************"
+cleanup
+
+cd $scriptdir
+
+umount $MOUNTPOINT/proc
+umount $MOUNTPOINT/dev
+umount $MOUNTPOINT
+
From a80dc4e4291f3a62883ea6fa726bc87c33107b61 Mon Sep 17 00:00:00 2001
From: "Manuel Amador (Rudd-O)"
Date: Fri, 27 Aug 2010 10:58:56 -0700
Subject: [PATCH 043/235] Fix debian packaging for systemvm premium and
systemvm iso
---
debian/cloud-agent-scripts.install | 1 +
debian/cloud-premium.install | 4 +---
2 files changed, 2 insertions(+), 3 deletions(-)
diff --git a/debian/cloud-agent-scripts.install b/debian/cloud-agent-scripts.install
index 48058f0e9f0..321e48109f9 100644
--- a/debian/cloud-agent-scripts.install
+++ b/debian/cloud-agent-scripts.install
@@ -1,2 +1,3 @@
/usr/lib/cloud/agent/scripts/*
/usr/lib/cloud/agent/vms/systemvm.zip
+/usr/lib/cloud/agent/vms/systemvm.iso
diff --git a/debian/cloud-premium.install b/debian/cloud-premium.install
index 8e7bba9de55..7871a23243f 100644
--- a/debian/cloud-premium.install
+++ b/debian/cloud-premium.install
@@ -4,6 +4,4 @@
/etc/cloud/management/components-premium.xml
/usr/share/cloud/setup/create-database-premium.sql
/usr/share/cloud/setup/create-schema-premium.sql
-/usr/lib/cloud/agent/scripts/vm/hypervisor/xen/*
-/usr/lib/cloud/agent/scripts/vm/hypervisor/xenserver/*
-/usr/lib/cloud/agent/vms/systemvm-premium.zip
+/usr/lib/cloud/agent/vms/systemvm-premium.iso
From d36227986ae6c5231081616f1cf0a5c40dc427a8 Mon Sep 17 00:00:00 2001
From: "Manuel Amador (Rudd-O)"
Date: Fri, 27 Aug 2010 11:14:35 -0700
Subject: [PATCH 044/235] require mkisofs for build processes in packaging
---
cloud.spec | 1 +
debian/control | 2 +-
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/cloud.spec b/cloud.spec
index 30f8a0b5588..2a4ed4d8ae0 100644
--- a/cloud.spec
+++ b/cloud.spec
@@ -34,6 +34,7 @@ BuildRequires: commons-httpclient
BuildRequires: jpackage-utils
BuildRequires: gcc
BuildRequires: glibc-devel
+BuildRequires: /usr/bin/mkisofs
%global _premium %(tar jtvmf %{SOURCE0} '*/cloudstack-proprietary/' --occurrence=1 2>/dev/null | wc -l)
diff --git a/debian/control b/debian/control
index 27e53bae905..0f1f3e5093a 100644
--- a/debian/control
+++ b/debian/control
@@ -2,7 +2,7 @@ Source: cloud
Section: libs
Priority: extra
Maintainer: Manuel Amador (Rudd-O)
-Build-Depends: debhelper (>= 7), openjdk-6-jdk, tomcat6, libws-commons-util-java, libcommons-dbcp-java, libcommons-collections-java, libcommons-httpclient-java, libservlet2.5-java
+Build-Depends: debhelper (>= 7), openjdk-6-jdk, tomcat6, libws-commons-util-java, libcommons-dbcp-java, libcommons-collections-java, libcommons-httpclient-java, libservlet2.5-java, genisoimage
Standards-Version: 3.8.1
Homepage: http://techcenter.cloud.com/software/cloudstack
From 7eb61b705a5a1dbda4a254f62f9925e6cf18694b Mon Sep 17 00:00:00 2001
From: Kelven Yang
Date: Thu, 26 Aug 2010 16:47:16 -0700
Subject: [PATCH 045/235] Allow NetworkManagerImpl and SecondaryStorageImpl to
tolerate missing of system vm template at startup
---
server/src/com/cloud/network/NetworkManagerImpl.java | 4 +++-
.../storage/secondary/SecondaryStorageManagerImpl.java | 2 +-
setup/db/templates.vmware.sql | 6 ------
3 files changed, 4 insertions(+), 8 deletions(-)
diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java
index dcc995448c2..35664556c3d 100644
--- a/server/src/com/cloud/network/NetworkManagerImpl.java
+++ b/server/src/com/cloud/network/NetworkManagerImpl.java
@@ -1830,7 +1830,9 @@ public class NetworkManagerImpl implements NetworkManager, VirtualMachineManager
_offering = _serviceOfferingDao.persistSystemServiceOffering(_offering);
_template = _templateDao.findById(_routerTemplateId);
if (_template == null) {
- throw new ConfigurationException("Unable to find the template for the router: " + _routerTemplateId);
+ s_logger.error("Unable to find system vm template.");
+
+ // throw new ConfigurationException("Unable to find the template for the router: " + _routerTemplateId);
}
_publicNetworkOffering = new NetworkOfferingVO(NetworkOfferingVO.SystemVmPublicNetwork, TrafficType.Public, null);
diff --git a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java
index 3f3fd1d7a5f..f516b16419c 100644
--- a/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java
+++ b/server/src/com/cloud/storage/secondary/SecondaryStorageManagerImpl.java
@@ -1370,7 +1370,7 @@ public class SecondaryStorageManagerImpl implements SecondaryStorageVmManager, V
_serviceOffering.setUniqueName("Cloud.com-SecondaryStorage");
_serviceOffering = _offeringDao.persistSystemServiceOffering(_serviceOffering);
_template = _templateDao.findConsoleProxyTemplate();
- if (_template == null) {
+ if (_template == null && _useServiceVM) {
throw new ConfigurationException("Unable to find the template for secondary storage vm VMs");
}
diff --git a/setup/db/templates.vmware.sql b/setup/db/templates.vmware.sql
index 53080bc6277..4ba86696071 100644
--- a/setup/db/templates.vmware.sql
+++ b/setup/db/templates.vmware.sql
@@ -1,9 +1,3 @@
-INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones)
- VALUES (1, 'routing', 'SystemVM Template', 0, now(), 'ext3', 0, 64, 1, 'http://nfs1.lab.vmops.com/templates/vmware/dummydomr.tar.bz2', '54c578d2c02759de4a9a8be7bd533df1', 0, 'SystemVM Template', 'VMDK', 47, 0, 1);
-
-INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones)
- VALUES (2, 'fedora11-x86', 'Fedora11-x86', 1, now(), 'ext3', 0, 32, 1, 'http://nfs1.lab.vmops.com/templates/vmware/fedora11-x86.tar.bz2', '7957ff05cae838689eb53c7600b2fbe4', 0, 'Fedora 11 x86', 'VMDK', 47, 1, 1);
-
INSERT INTO `cloud`.`guest_os_category` (id, name) VALUES (1, 'Windows');
INSERT INTO `cloud`.`guest_os_category` (id, name) VALUES (2, 'Linux');
INSERT INTO `cloud`.`guest_os_category` (id, name) VALUES (3, 'Novell Netware');
From 753fe25074992b97cc8e5238dbe4186f171e855c Mon Sep 17 00:00:00 2001
From: Kelven Yang
Date: Fri, 27 Aug 2010 09:36:06 -0700
Subject: [PATCH 046/235] Link with create/start command for vmware VMs
---
core/src/com/cloud/agent/api/storage/CreateCommand.java | 6 ++++++
setup/db/templates.vmware.sql | 3 +++
2 files changed, 9 insertions(+)
diff --git a/core/src/com/cloud/agent/api/storage/CreateCommand.java b/core/src/com/cloud/agent/api/storage/CreateCommand.java
index 99c3d3051c5..ab370027c8d 100644
--- a/core/src/com/cloud/agent/api/storage/CreateCommand.java
+++ b/core/src/com/cloud/agent/api/storage/CreateCommand.java
@@ -30,6 +30,7 @@ public class CreateCommand extends Command {
private DiskCharacteristics diskCharacteristics;
private String templateUrl;
private long size;
+ private String instanceName;
protected CreateCommand() {
super();
@@ -63,6 +64,7 @@ public class CreateCommand extends Command {
this.pool = new StoragePoolTO(pool);
this.templateUrl = null;
this.size = size;
+ this.instanceName = vm.getInstanceName();
}
@Override
@@ -89,4 +91,8 @@ public class CreateCommand extends Command {
public long getSize(){
return this.size;
}
+
+ public String getInstanceName() {
+ return instanceName;
+ }
}
diff --git a/setup/db/templates.vmware.sql b/setup/db/templates.vmware.sql
index 4ba86696071..bfffd2666d8 100644
--- a/setup/db/templates.vmware.sql
+++ b/setup/db/templates.vmware.sql
@@ -1,3 +1,6 @@
+INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones)
+ VALUES (2, 'blank', 'BlankVM', 1, now(), 'ext3', 0, 32, 1, 'http://nfs1.lab.vmops.com/templates/vmware/blankvm.tar.bz2', '3eff7ce3d25cf9433efde8b245c63fcb', 0, 'BlankVM', 'VMDK', 47, 1, 1);
+
INSERT INTO `cloud`.`guest_os_category` (id, name) VALUES (1, 'Windows');
INSERT INTO `cloud`.`guest_os_category` (id, name) VALUES (2, 'Linux');
INSERT INTO `cloud`.`guest_os_category` (id, name) VALUES (3, 'Novell Netware');
From e9ab931a55757b21bab93c66ba56d4be8c0f57f5 Mon Sep 17 00:00:00 2001
From: Kelven Yang
Date: Fri, 27 Aug 2010 16:03:57 -0700
Subject: [PATCH 047/235] Add windows xp template to vmware
---
setup/db/templates.vmware.sql | 2 ++
1 file changed, 2 insertions(+)
diff --git a/setup/db/templates.vmware.sql b/setup/db/templates.vmware.sql
index bfffd2666d8..34075a3aac7 100644
--- a/setup/db/templates.vmware.sql
+++ b/setup/db/templates.vmware.sql
@@ -1,5 +1,7 @@
INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones)
VALUES (2, 'blank', 'BlankVM', 1, now(), 'ext3', 0, 32, 1, 'http://nfs1.lab.vmops.com/templates/vmware/blankvm.tar.bz2', '3eff7ce3d25cf9433efde8b245c63fcb', 0, 'BlankVM', 'VMDK', 47, 1, 1);
+INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones)
+ VALUES (3, 'winxpsp3', 'WindowsXP-SP3', 1, now(), 'ntfs', 0, 32, 1, 'http://nfs1.lab.vmops.com/templates/vmware/winxpsp3.tar.bz2', '385e67d17a2cb3795bd0b0fb7f88dc5e', 0, 'WindowsXP-SP3', 'VMDK', 16, 1, 1);
INSERT INTO `cloud`.`guest_os_category` (id, name) VALUES (1, 'Windows');
INSERT INTO `cloud`.`guest_os_category` (id, name) VALUES (2, 'Linux');
From 5bd4c7afbf4d9024ce38829400f78559587164eb Mon Sep 17 00:00:00 2001
From: Chiradeep Vittal
Date: Fri, 27 Aug 2010 18:15:31 -0700
Subject: [PATCH 048/235] Issue #: 4203 restart java agent
---
console-proxy/scripts/_run.sh | 51 ++++++++++++++++++++++++++++++
console-proxy/scripts/run.sh | 59 +++++++----------------------------
2 files changed, 62 insertions(+), 48 deletions(-)
create mode 100755 console-proxy/scripts/_run.sh
diff --git a/console-proxy/scripts/_run.sh b/console-proxy/scripts/_run.sh
new file mode 100755
index 00000000000..e90005d2ebb
--- /dev/null
+++ b/console-proxy/scripts/_run.sh
@@ -0,0 +1,51 @@
+#!/usr/bin/env bash
+#run.sh runs the console proxy.
+
+# make sure we delete the old files from the original template
+rm console-proxy.jar
+rm console-common.jar
+rm conf/cloud.properties
+
+set -x
+
+CP=./:./conf
+for file in *.jar
+do
+ CP=${CP}:$file
+done
+keyvalues=
+if [ -f /mnt/cmdline ]
+then
+ CMDLINE=$(cat /mnt/cmdline)
+else
+ CMDLINE=$(cat /proc/cmdline)
+fi
+#CMDLINE="graphical utf8 eth0ip=0.0.0.0 eth0mask=255.255.255.0 eth1ip=192.168.140.40 eth1mask=255.255.255.0 eth2ip=172.24.0.50 eth2mask=255.255.0.0 gateway=172.24.0.1 dns1=72.52.126.11 template=domP dns2=72.52.126.12 host=192.168.1.142 port=8250 mgmtcidr=192.168.1.0/24 localgw=192.168.140.1 zone=5 pod=5"
+for i in $CMDLINE
+ do
+ KEY=$(echo $i | cut -s -d= -f1)
+ VALUE=$(echo $i | cut -s -d= -f2)
+ [ "$KEY" == "" ] && continue
+ case $KEY in
+ *)
+ keyvalues="${keyvalues} $KEY=$VALUE"
+ esac
+ done
+
+tot_mem_k=$(cat /proc/meminfo | grep MemTotal | awk '{print $2}')
+let "tot_mem_m=tot_mem_k>>10"
+let "eightypcnt=$tot_mem_m*8/10"
+let "maxmem=$tot_mem_m-80"
+
+if [ $maxmem -gt $eightypcnt ]
+then
+ maxmem=$eightypcnt
+fi
+
+EXTRA=
+if [ -f certs/realhostip.keystore ]
+then
+ EXTRA="-Djavax.net.ssl.trustStore=$(dirname $0)/certs/realhostip.keystore -Djavax.net.ssl.trustStorePassword=vmops.com"
+fi
+
+java -mx${maxmem}m ${EXTRA} -cp $CP com.cloud.agent.AgentShell $keyvalues $@
diff --git a/console-proxy/scripts/run.sh b/console-proxy/scripts/run.sh
index e90005d2ebb..34eb5844415 100755
--- a/console-proxy/scripts/run.sh
+++ b/console-proxy/scripts/run.sh
@@ -1,51 +1,14 @@
-#!/usr/bin/env bash
-#run.sh runs the console proxy.
+#!/bin/bash
+#run.sh runs the agent client.
-# make sure we delete the old files from the original template
-rm console-proxy.jar
-rm console-common.jar
-rm conf/cloud.properties
-
-set -x
-
-CP=./:./conf
-for file in *.jar
+# set -x
+
+while true
do
- CP=${CP}:$file
+ ./run.sh "$@"
+ ex=$?
+ if [ $ex -eq 0 ] || [ $ex -eq 1 ] || [ $ex -eq 66 ] || [ $ex -gt 128 ]; then
+ exit $ex
+ fi
+ sleep 20
done
-keyvalues=
-if [ -f /mnt/cmdline ]
-then
- CMDLINE=$(cat /mnt/cmdline)
-else
- CMDLINE=$(cat /proc/cmdline)
-fi
-#CMDLINE="graphical utf8 eth0ip=0.0.0.0 eth0mask=255.255.255.0 eth1ip=192.168.140.40 eth1mask=255.255.255.0 eth2ip=172.24.0.50 eth2mask=255.255.0.0 gateway=172.24.0.1 dns1=72.52.126.11 template=domP dns2=72.52.126.12 host=192.168.1.142 port=8250 mgmtcidr=192.168.1.0/24 localgw=192.168.140.1 zone=5 pod=5"
-for i in $CMDLINE
- do
- KEY=$(echo $i | cut -s -d= -f1)
- VALUE=$(echo $i | cut -s -d= -f2)
- [ "$KEY" == "" ] && continue
- case $KEY in
- *)
- keyvalues="${keyvalues} $KEY=$VALUE"
- esac
- done
-
-tot_mem_k=$(cat /proc/meminfo | grep MemTotal | awk '{print $2}')
-let "tot_mem_m=tot_mem_k>>10"
-let "eightypcnt=$tot_mem_m*8/10"
-let "maxmem=$tot_mem_m-80"
-
-if [ $maxmem -gt $eightypcnt ]
-then
- maxmem=$eightypcnt
-fi
-
-EXTRA=
-if [ -f certs/realhostip.keystore ]
-then
- EXTRA="-Djavax.net.ssl.trustStore=$(dirname $0)/certs/realhostip.keystore -Djavax.net.ssl.trustStorePassword=vmops.com"
-fi
-
-java -mx${maxmem}m ${EXTRA} -cp $CP com.cloud.agent.AgentShell $keyvalues $@
From c9da15ff5e8f60d9496c382a2c87e7b19d4071e2 Mon Sep 17 00:00:00 2001
From: Chiradeep Vittal
Date: Fri, 27 Aug 2010 18:22:22 -0700
Subject: [PATCH 049/235] Issue #: 4203 restart java agent
---
console-proxy/scripts/run.sh | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/console-proxy/scripts/run.sh b/console-proxy/scripts/run.sh
index 34eb5844415..4ea7608a8f5 100755
--- a/console-proxy/scripts/run.sh
+++ b/console-proxy/scripts/run.sh
@@ -1,11 +1,11 @@
#!/bin/bash
-#run.sh runs the agent client.
+#_run.sh runs the agent client.
# set -x
while true
do
- ./run.sh "$@"
+ ./_run.sh "$@"
ex=$?
if [ $ex -eq 0 ] || [ $ex -eq 1 ] || [ $ex -eq 66 ] || [ $ex -gt 128 ]; then
exit $ex
From a517338ac74b8bf094b5d376cfc30498407fbc28 Mon Sep 17 00:00:00 2001
From: anthony
Date: Sat, 28 Aug 2010 19:17:40 -0700
Subject: [PATCH 050/235] fix a bug about backupsnapshot to nfs primary storage
---
scripts/vm/hypervisor/xenserver/vmopsSnapshot | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/scripts/vm/hypervisor/xenserver/vmopsSnapshot b/scripts/vm/hypervisor/xenserver/vmopsSnapshot
index 891257fb4a9..e4b62b3b160 100755
--- a/scripts/vm/hypervisor/xenserver/vmopsSnapshot
+++ b/scripts/vm/hypervisor/xenserver/vmopsSnapshot
@@ -458,12 +458,16 @@ def getIsTrueString(stringValue):
return booleanValue
def makeUnavailable(uuid, primarySRPath, isISCSI):
+ if not isISCSI:
+ return
VHD = getVHD(uuid, isISCSI)
path = os.path.join(primarySRPath, VHD)
manageAvailability(path, '-an')
return
def manageAvailability(path, value):
+ if path.__contains__("/var/run/sr-mount"):
+ return
util.SMlog("Setting availability of " + path + " to " + value)
try:
cmd = ['/usr/sbin/lvchange', value, path]
From 55f3a65ec0c1798476c732d1a878d8f83746e92d Mon Sep 17 00:00:00 2001
From: anthony
Date: Sat, 28 Aug 2010 21:17:32 -0700
Subject: [PATCH 051/235] change plugin timeout to 1800s
---
.../com/cloud/hypervisor/xen/resource/CitrixResourceBase.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
index cf552dabc4c..d7ff888fb84 100644
--- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
+++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
@@ -3484,7 +3484,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
// TODO Auto-generated catch block
e.printStackTrace();
}
- slaveConn = new Connection(slaveUrl, 10);
+ slaveConn = new Connection(slaveUrl, 1800);
slaveSession = Session.slaveLocalLoginWithPassword(slaveConn, _username, _password);
if (s_logger.isDebugEnabled()) {
From 4b3777e656b882880e0a52db3181a188f214a8c0 Mon Sep 17 00:00:00 2001
From: anthony
Date: Sun, 29 Aug 2010 15:43:18 -0700
Subject: [PATCH 052/235] clean up disableVlanNetwork
---
.../cloud/hypervisor/xen/resource/CitrixResourceBase.java | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
index d7ff888fb84..b7e46cb4593 100644
--- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
+++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
@@ -17,6 +17,7 @@
*/
package com.cloud.hypervisor.xen.resource;
+
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
@@ -3829,13 +3830,9 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
} catch (XenAPIException e) {
String msg = "Unable to disable VLAN network due to " + e.toString();
s_logger.warn(msg, e);
- throw new InternalErrorException(msg);
- } catch (XmlRpcException e) {
+ } catch (Exception e) {
String msg = "Unable to disable VLAN network due to " + e.getMessage();
s_logger.warn(msg, e);
- throw new InternalErrorException(msg);
- } catch (Exception e) {
- throw new InternalErrorException(e.getMessage());
}
}
From e270011aed32f04f0ce1a228a9e247c3be80fbde Mon Sep 17 00:00:00 2001
From: anthony
Date: Sun, 29 Aug 2010 18:01:25 -0700
Subject: [PATCH 053/235] add wrapper for vdi.copy
---
.../xen/resource/CitrixResourceBase.java | 15 ++++++++++-----
1 file changed, 10 insertions(+), 5 deletions(-)
diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
index b7e46cb4593..5d84c678a5a 100644
--- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
+++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
@@ -347,6 +347,11 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
}
}
+ protected VDI cloudVDIcopy(VDI vdi, SR sr) throws BadServerResponse, XenAPIException, XmlRpcException{
+ Connection conn = getConnection();
+ return vdi.copy(conn, sr);
+ }
+
protected void destroyStoppedVm() {
Map vmentries = null;
Connection conn = getConnection();
@@ -2104,7 +2109,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
s_logger.warn(msg);
return new DownloadAnswer(null, 0, msg, com.cloud.storage.VMTemplateStorageResourceAssoc.Status.DOWNLOAD_ERROR, "", "", 0);
}
- vmtmpltvdi = tmpltvdi.copy(conn, poolsr);
+ vmtmpltvdi = cloudVDIcopy(tmpltvdi, poolsr);
vmtmpltvdi.setNameLabel(conn, "Template " + cmd.getName());
// vmtmpltvdi.setNameDescription(conn, cmd.getDescription());
@@ -5369,7 +5374,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
srcVolume = getVDIbyUuid(volumeUUID);
// Copy the volume to secondary storage
- destVolume = srcVolume.copy(conn, secondaryStorage);
+ destVolume = cloudVDIcopy(srcVolume, secondaryStorage);
} else {
// Mount the volume folder
secondaryStorage = createNfsSRbyURI(new URI(secondaryStorageURL + "/volumes/" + volumeFolder), false);
@@ -5389,7 +5394,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
// Copy the volume to the primary storage pool
primaryStoragePool = getStorageRepository(conn, pool);
- destVolume = srcVolume.copy(conn, primaryStoragePool);
+ destVolume = cloudVDIcopy(srcVolume, primaryStoragePool);
}
String srUUID;
@@ -5778,7 +5783,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
// Look up the snapshot and copy it to secondary storage
VDI snapshot = getVDIbyUuid(snapshotUUID);
- privateTemplate = snapshot.copy(conn, secondaryStorage);
+ privateTemplate = cloudVDIcopy(snapshot, secondaryStorage);
if (userSpecifiedName != null) {
privateTemplate.setNameLabel(conn, userSpecifiedName);
@@ -6024,7 +6029,7 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
if (vdi != null) {
s_logger.debug("Successfully created VDI on secondary storage SR " + temporarySROnSecondaryStorage.getNameLabel(conn) + " with uuid " + vhdUUID);
s_logger.debug("Copying VDI: " + vdi.getLocation(conn) + " from secondary to primary");
- VDI vdiOnPrimaryStorage = vdi.copy(conn, primaryStorageSR);
+ VDI vdiOnPrimaryStorage = cloudVDIcopy(vdi, primaryStorageSR);
// vdi.copy introduces the vdi into the database. Don't
// need to do a scan on the primary
// storage.
From afd8052203a0914a8c422d80699e331591a979ab Mon Sep 17 00:00:00 2001
From: anthony
Date: Sun, 29 Aug 2010 18:39:15 -0700
Subject: [PATCH 054/235] remove unused scripts
---
.../hypervisor/xenserver/check_heartbeat.sh | 58 ---------
scripts/vm/hypervisor/xenserver/find_bond.sh | 111 ------------------
scripts/vm/hypervisor/xenserver/launch_hb.sh | 30 -----
.../xenserver/setup_heartbeat_sr.sh | 83 -------------
scripts/vm/hypervisor/xenserver/vmops | 48 +-------
.../vm/hypervisor/xenserver/xenheartbeat.sh | 62 ----------
.../vm/hypervisor/xenserver/xenserver56/patch | 5 -
scripts/vm/hypervisor/xenserver/xs_cleanup.sh | 54 ---------
8 files changed, 2 insertions(+), 449 deletions(-)
delete mode 100755 scripts/vm/hypervisor/xenserver/check_heartbeat.sh
delete mode 100755 scripts/vm/hypervisor/xenserver/find_bond.sh
delete mode 100755 scripts/vm/hypervisor/xenserver/launch_hb.sh
delete mode 100755 scripts/vm/hypervisor/xenserver/setup_heartbeat_sr.sh
delete mode 100755 scripts/vm/hypervisor/xenserver/xenheartbeat.sh
delete mode 100755 scripts/vm/hypervisor/xenserver/xs_cleanup.sh
diff --git a/scripts/vm/hypervisor/xenserver/check_heartbeat.sh b/scripts/vm/hypervisor/xenserver/check_heartbeat.sh
deleted file mode 100755
index 2f5b40022c3..00000000000
--- a/scripts/vm/hypervisor/xenserver/check_heartbeat.sh
+++ /dev/null
@@ -1,58 +0,0 @@
-#!/bin/bash
-
-#set -x
-
-usage() {
- printf "Usage: %s [uuid of this host] [interval in seconds]\n" $(basename $0) >&2
-
-}
-
-if [ -z $1 ]; then
- usage
- exit 2
-fi
-
-if [ -z $2 ]; then
- usage
- exit 3
-fi
-
-
-date=`date +%s`
-hbs=`lvscan | grep hb-$1 | awk '{print $2}'`
-for hb in $hbs
-do
- hb=${hb:1:`expr ${#hb} - 2`}
- active=`lvscan | grep $hb | awk '{print $1}'`
- if [ "$active" == "inactive" ]; then
- lvchange -ay $hb
- if [ ! -L $hb ]; then
- continue;
- fi
- fi
- ping=`dd if=$hb bs=1 count=100`
- if [ $? -ne 0 ]; then
- continue;
- fi
- diff=`expr $date - $ping`
- if [ $diff -lt $2 ]; then
- echo "=====> ALIVE <====="
- exit 0;
- fi
-done
-
-hbs=`ls -l /var/run/sr-mount/*/hb-$1 | awk '{print $9}'`
-for hb in $hbs
-do
- ping=`cat $hb`
- if [ $? -ne 0 ]; then
- continue;
- fi
- diff=`expr $date - $ping`
- if [ $diff -lt $2 ]; then
- echo "=====> ALIVE <====="
- exit 0;
- fi
-done
-
-echo "=====> DEAD <======"
diff --git a/scripts/vm/hypervisor/xenserver/find_bond.sh b/scripts/vm/hypervisor/xenserver/find_bond.sh
deleted file mode 100755
index 2818259c06f..00000000000
--- a/scripts/vm/hypervisor/xenserver/find_bond.sh
+++ /dev/null
@@ -1,111 +0,0 @@
-#!/bin/sh
-# $Id: find_bond.sh 10510 2010-07-11 10:10:03Z alex $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/hypervisor/xenserver/find_bond.sh $
-
-#set -x
-
-
-cleanup_vlan() {
- for vlan in `xe vlan-list | grep uuid | awk '{print $NF}'`; do
- untagged=$(xe vlan-param-list uuid=$vlan | grep untagged | awk '{print $NF}')
- network=$(xe pif-param-get param-name=network-uuid uuid=$untagged)
- xe vlan-destroy uuid=$vlan
- xe network-destroy uuid=$network
- done
-}
-
-usage() {
- echo "$0 device"
- exit 1
-}
-
-sflag=
-dflag=
-
-while getopts 'sd' OPTION
-do
- case $OPTION in
- d) dflag=1
- ;;
- s) sflag=1
- ;;
- ?) usage
- exit 1
- ;;
- esac
-done
-
-shift $(($OPTIND - 1))
-nic=$1
-
-[ -z "$nic" ] && usage
-
-addr=$(ip addr | grep $nic | grep inet | awk '{print $2}')
-addr=${addr%/*}
-bridges=$(brctl show | grep -v bridge | awk '{print $1}')
-
-host_uuid=$(xe host-list hostname=$(hostname) | grep uuid | awk '{print $NF}')
-if [ -z "$host_uuid" ]; then
- printf "Unable to find host uuid using $(hostname)\n" >&2
- exit 2
-fi
-
-
-if [ -z "$addr" ]; then
- printf "Unable to find an ip address for $nic\n" >&2
- exit 3
-fi
-
-current=$(brctl show | grep $nic | awk '{print $NF}')
-for dev in `ip addr | grep mtu | grep -v -E "\.[0-9]*@|lo|$nic|$current" | awk '{print $2}'`
-do
- dev=${dev%:}
- echo $bridges | grep $dev >/dev/null 2>&1
- br=$?
- ifconfig $dev | grep UP >/dev/null 2>&1
- rc=$?
- if [ $rc -eq 1 ]; then
- ifconfig $dev up
- sleep 4
- fi
- arping -q -c 1 -w 2 -D -I $dev $addr >/dev/null 2>&1
- rc=$?
- if [ $rc -ne 1 ]; then
- continue;
- fi
-
- if [ $br -ne 0 ]; then
- # What we've found is the naked nic.
- pif_uuid=$(xe pif-list device=$dev host-uuid=$host_uuid | grep -B 3 "( RO): -1" | grep uuid | awk '{print $NF}')
- if [ -z "$pif_uuid" ]; then
- mac=$(ifconfig $dev | grep HWaddr | awk '{print $NF}')
- pif_uuid=$(xe pif-introduce host-uuid=$host_uuid device=$dev mac=$mac)
- fi
-
- if [ -z $pif_uuid ]; then
- continue;
- fi
-
- bridge=$(xe network-list PIF-uuids=$pif_uuid | grep bridge | awk '{print $NF}')
- if [ -z $bridge ]; then
- continue;
- fi
-
- xe pif-plug uuid=$pif_uuid
-
- echo ">>>$dev<<<"
- exit 0
- else
- # What we've found is the bridge
- network_uuid=`xe network-list bridge=$dev | grep uuid | awk '{print $NF}'`
- if [ -z "$network_uuid" ]; then
- continue;
- fi
- pif=`xe pif-list network-uuid=$network_uuid host-uuid=$host_uuid VLAN=-1 | grep device | awk '{print $NF}'`
- if [ -z "$pif" ]; then
- continue;
- fi
- echo ">>>$pif<<<"
- exit 0
- fi
-done
-exit 4
diff --git a/scripts/vm/hypervisor/xenserver/launch_hb.sh b/scripts/vm/hypervisor/xenserver/launch_hb.sh
deleted file mode 100755
index 849565e1e71..00000000000
--- a/scripts/vm/hypervisor/xenserver/launch_hb.sh
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/bin/bash
-
-#set -x
-
-usage() {
- printf "Usage: %s [uuid of this host] [interval in seconds]\n" $(basename $0)
-
-}
-
-if [ -z $1 ]; then
- usage
- exit 2
-fi
-
-if [ -z $2 ]; then
- usage
- exit 3
-fi
-
-if [ ! -f /opt/xensource/bin/xenheartbeat.sh ]; then
- printf "Error: Unable to find xenheartbeat.sh to launch\n"
- exit 4
-fi
-
-for psid in `ps -ef | grep xenheartbeat | grep -v grep | awk '{print $2}'`; do
- kill $psid
-done
-
-nohup /opt/xensource/bin/xenheartbeat.sh $1 $2 >/var/log/heartbeat.log 2>&1 &
-echo "======> DONE <======"
diff --git a/scripts/vm/hypervisor/xenserver/setup_heartbeat_sr.sh b/scripts/vm/hypervisor/xenserver/setup_heartbeat_sr.sh
deleted file mode 100755
index e6d394866ce..00000000000
--- a/scripts/vm/hypervisor/xenserver/setup_heartbeat_sr.sh
+++ /dev/null
@@ -1,83 +0,0 @@
-#!/bin/bash
-
-#set -x
-
-usage() {
- printf "Usage: %s [uuid of this host] [uuid of the sr to place the heartbeat]\n" $(basename $0) >&2
-
-}
-
-
-if [ -z $1 ]; then
- usage
- exit 2
-fi
-
-if [ -z $2 ]; then
- usage
- exit 3
-fi
-
-if [ `xe host-list | grep $1 | wc -l` -ne 1 ]; then
- printf "Error: Unable to find the host uuid: $1\n" >&2
- usage
- exit 4
-fi
-
-if [ `xe sr-list uuid=$2 | wc -l` -eq 0 ]; then
- printf "Error: Unable to find SR with uuid: $2\n" >&2
- usage
- exit 5
-fi
-
-if [ `xe pbd-list sr-uuid=$2 | grep -B 1 $1 | wc -l` -eq 0 ]; then
- printf "Error: Unable to find a pbd for the SR: $2\n" >&2
- usage
- exit 6
-fi
-
-srtype=`xe sr-param-get param-name=type uuid=$2`
-
-if [ "$srtype" == "nfs" ];then
- filename=/var/run/sr-mount/$2/hb-$1
- files=`ls /var/run/sr-mount/$2 | grep "hb-$1"`
- if [ -z "$files" ]; then
- date=`date +%s`
- echo "$date" > $filename
- fi
-
-else
-
- link=/dev/VG_XenStorage-$2/hb-$1
- lv=`lvscan | grep $link`
- if [ -z "$lv" ]; then
- lvcreate VG_XenStorage-$2 -n hb-$1 --size 1M
- if [ $? -ne 0 ]; then
- printf "Error: Unable to create heartbeat SR\n" >&2
- exit 7
- fi
- lv=`lvscan | grep $link`
- if [ -z "$lv" ]; then
- printf "Error: Unable to create heartbeat SR\n" >&2
- exit 8
- fi
- fi
-
- if [ `echo $lv | awk '{print $1}'` == "inactive" ]; then
- lvchange -ay $link
- if [ $? -ne 0 ]; then
- printf "Error: Unable to make the heartbeat SR active\n" >&2
- exit 8
- fi
- fi
-
- if [ ! -L $link ]; then
- printf "Error: Unable to find the soft link $link\n" >&2
- exit 9
- fi
-
- dd if=/dev/zero of=$link bs=1 count=100
-fi
-
-echo "======> DONE <======"
-exit 0
diff --git a/scripts/vm/hypervisor/xenserver/vmops b/scripts/vm/hypervisor/xenserver/vmops
index dfc0c1d168e..af7faeca3b1 100755
--- a/scripts/vm/hypervisor/xenserver/vmops
+++ b/scripts/vm/hypervisor/xenserver/vmops
@@ -52,17 +52,7 @@ def gethostvmstats(session, args):
result = hostvmstats.get_stats(session, collect_host_stats, consolidation_function, interval, start_time)
return result
-@echo
-def find_bond(session, args):
- nic = args['arg1']
- try:
- cmd = ["bash", "/opt/xensource/bin/find_bond.sh", nic]
- txt = util.pread2(cmd)
- except:
- txt = ''
-
- return txt
-
+
@echo
def setup_iscsi(session, args):
uuid=args['uuid']
@@ -428,40 +418,6 @@ def networkUsage(session, args):
return txt
-@echo
-def setup_heartbeat_sr(session, args):
- host = args['host']
- sr = args['sr']
- try:
- cmd = ["bash", "/opt/xensource/bin/setup_heartbeat_sr.sh", host, sr]
- txt = util.pread2(cmd)
- except:
- txt = ''
- return txt
-
-@echo
-def check_heartbeat(session, args):
- host = args['host']
- interval = args['interval']
- try:
- cmd = ["bash", "/opt/xensource/bin/check_heartbeat.sh", host, interval]
- txt = util.pread2(cmd)
- except:
- txt=''
- return txt
-
-
-@echo
-def heartbeat(session, args):
- host = args['host']
- interval = args['interval']
- try:
- cmd = ["/bin/bash", "/opt/xensource/bin/launch_hb.sh", host, interval]
- txt = util.pread2(cmd)
- except:
- txt='fail'
- return txt
-
def get_private_nic( args):
session = get_xapi_session()
vms = session.xenapi.VM.get_all()
@@ -1132,5 +1088,5 @@ def network_rules(session, args):
if __name__ == "__main__":
- XenAPIPlugin.dispatch({"pingtest": pingtest, "setup_heartbeat_sr":setup_heartbeat_sr, "check_heartbeat":check_heartbeat, "heartbeat": heartbeat, "setup_iscsi":setup_iscsi, "find_bond": find_bond, "gethostvmstats": gethostvmstats, "getvncport": getvncport, "getgateway": getgateway, "getnetwork": getnetwork, "preparemigration": preparemigration, "setIptables": setIptables, "patchdomr": patchdomr, "pingdomr": pingdomr, "pingxenserver": pingxenserver, "ipassoc": ipassoc, "vm_data": vm_data, "savePassword": savePassword, "saveDhcpEntry": saveDhcpEntry, "setFirewallRule": setFirewallRule, "setLoadBalancerRule": setLoadBalancerRule, "createFile": createFile, "deleteFile": deleteFile, "checkMount": checkMount, "checkIscsi": checkIscsi, "networkUsage": networkUsage, "network_rules":network_rules, "can_bridge_firewall":can_bridge_firewall, "default_network_rules":default_network_rules, "destroy_network_rules_for_vm":destroy_network_rules_for_vm, "default_network_rules_systemvm":default_network_rules_systemvm, "get_rule_logs_for_vms":get_rule_logs_for_vms, "setLinkLocalIP":setLinkLocalIP})
+ XenAPIPlugin.dispatch({"pingtest": pingtest, "setup_iscsi":setup_iscsi, "gethostvmstats": gethostvmstats, "getvncport": getvncport, "getgateway": getgateway, "getnetwork": getnetwork, "preparemigration": preparemigration, "setIptables": setIptables, "patchdomr": patchdomr, "pingdomr": pingdomr, "pingxenserver": pingxenserver, "ipassoc": ipassoc, "vm_data": vm_data, "savePassword": savePassword, "saveDhcpEntry": saveDhcpEntry, "setFirewallRule": setFirewallRule, "setLoadBalancerRule": setLoadBalancerRule, "createFile": createFile, "deleteFile": deleteFile, "checkMount": checkMount, "checkIscsi": checkIscsi, "networkUsage": networkUsage, "network_rules":network_rules, "can_bridge_firewall":can_bridge_firewall, "default_network_rules":default_network_rules, "destroy_network_rules_for_vm":destroy_network_rules_for_vm, "default_network_rules_systemvm":default_network_rules_systemvm, "get_rule_logs_for_vms":get_rule_logs_for_vms, "setLinkLocalIP":setLinkLocalIP})
diff --git a/scripts/vm/hypervisor/xenserver/xenheartbeat.sh b/scripts/vm/hypervisor/xenserver/xenheartbeat.sh
deleted file mode 100755
index 6c616f435ea..00000000000
--- a/scripts/vm/hypervisor/xenserver/xenheartbeat.sh
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/bin/bash
-# Version @VERSION@
-
-#set -x
-
-usage() {
- printf "Usage: %s [uuid of this host] [interval in seconds]\n" $(basename $0) >&2
-
-}
-
-if [ -z $1 ]; then
- usage
- exit 2
-fi
-
-if [ -z $2 ]; then
- usage
- exit 3
-fi
-
-
-hbs=
-while true
-do
- sleep $2
-
- date=`date +%s`
- lvscan
- hbs=`ls -l /dev/VG*/hb-$1 | awk '{print $9}'`
- for hb in $hbs
- do
- echo $date | dd of=$hb count=100 bs=1
- if [ $? -ne 0 ]; then
- reboot -f
- echo "Problem with $hb";
- fi
- done
-
-
- dirs=`ls /var/run/sr-mount`
- if [ "$dirs" == "" ]; then
- continue
- fi
-
- ls /var/run/sr-mount/* >/dev/null 2>&1
- if [ $? -ne 0 ]; then
- reboot -f
- echo "Problem with ls";
- fi
-
- hbs=`ls -l /var/run/sr-mount/*/hb-$1 | awk '{print $9}'`
- for hb in $hbs
- do
- echo $date > $hb
- if [ $? -ne 0 ]; then
- reboot -f
- echo "Problem with $hb";
- fi
- done
-
-done
-
diff --git a/scripts/vm/hypervisor/xenserver/xenserver56/patch b/scripts/vm/hypervisor/xenserver/xenserver56/patch
index 14b4039c5a2..29dd2c7a08c 100644
--- a/scripts/vm/hypervisor/xenserver/xenserver56/patch
+++ b/scripts/vm/hypervisor/xenserver/xenserver56/patch
@@ -29,13 +29,8 @@ prepsystemvm.sh=..,0755,/opt/xensource/bin
setupxenserver.sh=..,0755,/opt/xensource/bin
make_migratable.sh=..,0755,/opt/xensource/bin
networkUsage.sh=..,0755,/opt/xensource/bin
-find_bond.sh=..,0755,/opt/xensource/bin
setup_iscsi.sh=..,0755,/opt/xensource/bin
version=..,0755,/opt/xensource/bin
-setup_heartbeat_sr.sh=..,0755,/opt/xensource/bin
-check_heartbeat.sh=..,0755,/opt/xensource/bin
-xenheartbeat.sh=..,0755,/opt/xensource/bin
-launch_hb.sh=..,0755,/opt/xensource/bin
pingtest.sh=../../..,0755,/opt/xensource/bin
dhcp_entry.sh=../../../../network/domr/,0755,/opt/xensource/bin
ipassoc.sh=../../../../network/domr/,0755,/opt/xensource/bin
diff --git a/scripts/vm/hypervisor/xenserver/xs_cleanup.sh b/scripts/vm/hypervisor/xenserver/xs_cleanup.sh
deleted file mode 100755
index cb81a3f16ef..00000000000
--- a/scripts/vm/hypervisor/xenserver/xs_cleanup.sh
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/bin/bash
-
-#set -x
-
-usage() {
- printf "Usage: %s \n" $(basename $0) >&2
-
-}
-
-# remove device which is in xenstore but not in xapi
-remove_device() {
- be=$1
- xenstore-write /local/domain/0/backend/tap/0/$be/online 0 &>/dev/null
- xenstore-write /local/domain/0/backend/tap/0/$be/shutdown-request normal &>/dev/null
- for i in $(seq 20)
- do
- sleep 1
- xenstore-exists /local/domain/0/backend/tap/0/$be/shutdown-done &>/dev/null
- if [ $? -eq 0 ] ; then
- xenstore-rm /local/domain/0/device/vbd/$be &>/dev/null
- xenstore-rm /local/domain/0/backend/tap/0/$be &>/dev/null
- xenstore-rm /local/domain/0/error/backend/tap/0/$be &>/dev/null
- xenstore-rm /local/domain/0/error/device/vbd/$be &>/dev/null
- return
- fi
- xenstore-exists /local/domain/0/backend/tap/0/$be &>/dev/null
- if [ $? -ne 0 ] ; then
- return
- fi
- done
-
- echo "unplug device $be failed"
- exit 2
-}
-
-bes=`xenstore-list /local/domain/0/backend/tap/0`
-
-if [ -z "$bes" ]; then
- exit 0
-fi
-
-for be in $bes
-do
- device=`xenstore-read /local/domain/0/backend/tap/0/$be/dev`
- ls $device >/dev/null 2>&1
- if [ $? -ne 0 ]; then
- remove_device $be
- fi
-done
-
-
-echo "======> DONE <======"
-exit 0
-
From cad615e8e49c8acd65d55d1a609890244863aca8 Mon Sep 17 00:00:00 2001
From: anthony
Date: Sun, 29 Aug 2010 19:21:03 -0700
Subject: [PATCH 055/235] support multiple patch files
---
.../xen/resource/CitrixResourceBase.java | 98 +++++++++++--------
1 file changed, 55 insertions(+), 43 deletions(-)
diff --git a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
index 5d84c678a5a..f937bfaae63 100644
--- a/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
+++ b/core/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java
@@ -4312,51 +4312,56 @@ public abstract class CitrixResourceBase implements StoragePoolResource, ServerR
}
SCPClient scp = new SCPClient(sshConnection);
- File file = new File(_patchPath);
-
- Properties props = new Properties();
- props.load(new FileInputStream(file));
String path = _patchPath.substring(0, _patchPath.lastIndexOf(File.separator) + 1);
- for (Map.Entry
-
-
-
-
From 7882d2ad59dca4adc0bcd6bbabae95783ea77bb0 Mon Sep 17 00:00:00 2001
From: anthony
Date: Mon, 30 Aug 2010 19:43:29 -0700
Subject: [PATCH 068/235] if eth1 and eth2 in CP/SS VM are in same network, set
default gateway on eth2,
---
patches/xenserver/etc/init.d/seteth1 | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/patches/xenserver/etc/init.d/seteth1 b/patches/xenserver/etc/init.d/seteth1
index 7c5e8d79c08..4079472f79b 100755
--- a/patches/xenserver/etc/init.d/seteth1
+++ b/patches/xenserver/etc/init.d/seteth1
@@ -49,7 +49,11 @@ setup_common() {
if [ "$BOOTPROTO" == "static" ]
then
- replace_in_file /etc/sysconfig/network GATEWAY $GW
+ replace_in_file /etc/sysconfig/network GATEWAY $GW
+ if [ "$ETH2_IP" != "0.0.0.0" ]
+ then
+ replace_in_file /etc/sysconfig/network GATEWAYDEV "eth2"
+ fi
else
sed -i /GATEWAY/d /etc/sysconfig/network
fi
From 25ac9104bbe124e7bba3f51443dda4951c7ad4b9 Mon Sep 17 00:00:00 2001
From: abhishek
Date: Tue, 31 Aug 2010 09:39:31 -0700
Subject: [PATCH 069/235] Adding migration script to remove the 'upgrade.url'
parameter from the 2.2 codebase
---
setup/db/migration/data-21to22.sql | 8 ++++++++
1 file changed, 8 insertions(+)
create mode 100644 setup/db/migration/data-21to22.sql
diff --git a/setup/db/migration/data-21to22.sql b/setup/db/migration/data-21to22.sql
new file mode 100644
index 00000000000..0af83cc2afd
--- /dev/null
+++ b/setup/db/migration/data-21to22.sql
@@ -0,0 +1,8 @@
+--data upgrade from 21 to 22
+use cloud;
+
+START TRANSACTION;
+
+DELETE FROM configuration where name='upgrade.url';
+
+COMMIT;
From 91e3f8e89e8a542a47151c12033277c63ad79816 Mon Sep 17 00:00:00 2001
From: jessica
Date: Tue, 31 Aug 2010 11:36:11 -0700
Subject: [PATCH 070/235] fix bug 6050 - extend pagesize to 500
---
ui/scripts/cloud.core.templates.js | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/ui/scripts/cloud.core.templates.js b/ui/scripts/cloud.core.templates.js
index 47f73b6e99b..b4aefb01671 100644
--- a/ui/scripts/cloud.core.templates.js
+++ b/ui/scripts/cloud.core.templates.js
@@ -87,7 +87,7 @@ function showTemplatesTab() {
}
$.ajax({
- data: createURL("command=listOsTypes&response=json"),
+ data: createURL("command=listOsTypes&response=json"+maxPageSize),
dataType: "json",
success: function(json) {
types = json.listostypesresponse.ostype;
@@ -104,7 +104,7 @@ function showTemplatesTab() {
});
$.ajax({
- data: createURL("command=listServiceOfferings&response=json"),
+ data: createURL("command=listServiceOfferings&response=json"+maxPageSize),
dataType: "json",
success: function(json) {
var items = json.listserviceofferingsresponse.serviceoffering;
@@ -117,7 +117,7 @@ function showTemplatesTab() {
});
$.ajax({
- data: createURL("command=listDiskOfferings&response=json"),
+ data: createURL("command=listDiskOfferings&response=json"+maxPageSize),
dataType: "json",
success: function(json) {
var items = json.listdiskofferingsresponse.diskoffering;
From c65175aa40324ad7b326364ba9f959c9f236dfb2 Mon Sep 17 00:00:00 2001
From: anthony
Date: Tue, 31 Aug 2010 13:05:42 -0700
Subject: [PATCH 071/235] bug 6048: Check createvolume's return
status 6048: resolved fixed
---
server/src/com/cloud/storage/StorageManagerImpl.java | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java
index 53395a5a130..6ea715d25ed 100644
--- a/server/src/com/cloud/storage/StorageManagerImpl.java
+++ b/server/src/com/cloud/storage/StorageManagerImpl.java
@@ -901,8 +901,9 @@ public class StorageManagerImpl implements StorageManager {
return vols;
} catch (Exception e) {
- s_logger.error("Unexpected exception ", e);
-
+ if (s_logger.isDebugEnabled()) {
+ s_logger.debug(e.getMessage());
+ }
if (rootCreated != null) {
destroyVolume(rootCreated);
}
@@ -915,6 +916,9 @@ public class StorageManagerImpl implements StorageManager {
public long createUserVM(Account account, VMInstanceVO vm, VMTemplateVO template, DataCenterVO dc, HostPodVO pod, ServiceOfferingVO offering, DiskOfferingVO diskOffering,
List avoids, long size) {
List volumes = create(account, vm, template, dc, pod, offering, diskOffering, avoids, size);
+ if( volumes == null || volumes.size() == 0) {
+ throw new CloudRuntimeException("Unable to create volume for " + vm.getName());
+ }
for (VolumeVO v : volumes) {
long volumeId = v.getId();
From da32a7d43066da1c71cf7180ef700df6b773b693 Mon Sep 17 00:00:00 2001
From: NIKITA
Date: Tue, 24 Aug 2010 16:13:25 -0700
Subject: [PATCH 072/235] Close button for wizard instance
---
ui/new/content/tab_instance.htm | 586 +++++++
ui/new/css/main.css | 1955 ++++++++++++++++++++++++
ui/new/images/vm_closebutton.gif | Bin 0 -> 321 bytes
ui/new/images/vm_closebutton_hover.gif | Bin 0 -> 217 bytes
4 files changed, 2541 insertions(+)
create mode 100755 ui/new/content/tab_instance.htm
create mode 100644 ui/new/css/main.css
create mode 100644 ui/new/images/vm_closebutton.gif
create mode 100644 ui/new/images/vm_closebutton_hover.gif
diff --git a/ui/new/content/tab_instance.htm b/ui/new/content/tab_instance.htm
new file mode 100755
index 00000000000..21640742a50
--- /dev/null
+++ b/ui/new/content/tab_instance.htm
@@ -0,0 +1,586 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Details
+
+ Volume
+
+ Statistics
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Zone:
+
+
+
+ (zone name)
+
+
+
+
+
+ Template:
+
+
+
+
+
+
+
+
+
+ Service:
+
+
+
+
+
+
+
+
+
+ HA:
+
+
+
+
+
+
+
+
+
+
+
+ Created:
+
+
+
+
+
+
+
+
+
+ Account:
+
+
+
+
+
+
+
+
+
+ Domain:
+
+
+
+
+
+
+
+
+
+ Host:
+
+
+
+
+
+
+
+
+
+ ISO:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Step 1111
+
+ Step 2
+
+ Step 3
+
+ Step 4
+
+ Step 5
+
+
+
+
+
+
+
+
+ Step 1: Select a Template
+
+ Please select a template for your new virtual instance. You can also choose to select
+ a blank template from which an ISO image can be installed onto.
+
+ Please select the CPU, Memory and Storage requirement you need for your new Virtual
+ Instance
+
+
+
+ Service Offering
+
+
+
+
+
+
+ Back
+
+ Go to Step 3
+
+
+
+
+
+
+
+
+
+ Step 1
+
+ Step 2
+
+ Step 3
+
+ Step 4
+
+ Step 5
+
+
+
+
+
+
+
+ Step 3: Additional Data Disk Offering
+
+ Please select the CPU, Memory and Storage requirement you need for your new Virtual
+ Instance
+
+
+
+ Data Disk Offering
+
+
+
+
+
+
+
+ Back
+
+ Go to Step 4
+
+
+
+
+
+
+
+
+
+ Step 1
+
+ Step 2
+
+ Step 3
+
+ Step 4
+
+ Step 5
+
+
+
+
+
+
+
+ Step 4: Choose your Network
+
+ Please select the CPU, Memory and Storage requirement you need for your new Virtual
+ Instance
+
+
+
+ Network Offering
+
+
+
+
+
+
+
+
+
+ Some info about virtual network will appear here..Some info about virtual network
+ will appear here..Some info about virtual network will appear here..Some info about
+ virtual network will appear here..Some info about virtual network will appear here..Some
+ info about virtual network will appear here..
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Some info about virtual network will appear here..Some info about virtual network
+ will appear here..Some info about virtual network will appear here..Some info about
+ virtual network will appear here..Some info about virtual network will appear here..Some
+ info about virtual network will appear here.. Some info about virtual network will
+ appear here..Some info about virtual network will appear here..
+
+
+
+
+
+
+
+ Back
+
+ Go to Step 5
+
+
+
+
+
+
+
+
+
+ Step 1
+
+ Step 2
+
+ Step 3
+
+ Step 4
+
+ Step 5
+
+
+
+
+
+
+
+ Step 5: Last Step
+
+ Please select the CPU, Memory and Storage requirement you need for your new Virtual
+ Instance