LeaseWeb released its Private Cloud powered by Apache CloudStack two months ago . Apache CloudStack  is an open source software platform that pools computing resources to build public, private, and hybrid Infrastructure as a Service (IaaS) clouds.
In this post, I will give a short introduction of Apache CloudStack and introduce an easy way to test Apache CloudStack 4.2 on our local machine using DevCloud.
Apache CloudStack manages the network, storage, and compute nodes that make up a cloud infrastructure. Apache CloudStack provides a first-class user interface (UI), a command line tool named CloudMonkey , and a full-featured RESTful API. Apache CloudStack currently supports the most popular hypervisors: VMware, KVM, XenServer and Xen Cloud Platform (XCP).
For now, the latest stable version of Apache CloudStack is 4.2.0. However, if you want to change and test your change in Apache CloudStack, or test the new features of CloudStack, you can check out the Apache CloudStack source code, build RPM/DEB packages, and install them on servers. However, Apache CloudStack also provides an easier way for testing.
DevCloud  is a virtual appliance shipped as an OVA image which runs on VirtualBox (an opensource type-2 or desktop hypervisor) and can be used for CloudStack’s development and testing. An NFS server is already configured in DevCloud, the System VM Template for Apache CloudStack 4.0/4.1 and a ttylinux virtual machine template are already installed on it. Moreover, Xen hypervisor and Xen Cloud Platform (XCP) are already installed in DevCloud, so virtual machines can be deployed in it.
Now we can test Apache Cloudstack on our local machines using DevCloud:
(1) Install VirtualBox
(2) Create a “host-only” network in VirtualBox if not exists. Set the IPv4 to 192.168.56.1
(3) It is recommended that we install a Linux (such as CentOS, Ubuntu) virtual machine in VirtualBox as the working VM (WORK-VM) at first. There are two network adaptor attached to the VM (on is attached to NAT , another one is attached to the Host-Only Adaptor created in Step 2). Suppose it has a IP 192.168.56.2 .
Make sure the following programs have been installed: mysql-server, Python, Python-Dev (python-devel), mysql-connector-java, Java, tomcat6, python-paramiko, nfs-utils, Jsvc, maven, mysql-connector-python (pip install), requests (pip install)
(4) Get DevCloud2  and import it to VirtualBox. Please do NOT select “re-initialize the MAC address of all network cards”. Make sure ‘Enable PAE/NX’ mode under VM settings -> System -> Processor Tab is checked. Change the network setting like Step 3. The network configuration should like this:
2. Management server installation from CloudStack source codes
(5) Checkout Apache CloudStack source code from Apache Git repository in WORK-VM (see step 3).
git clone https://git-wip-us.apache.org/repos/asf/cloudstack.git testing cd testing git checkout 4.2 # or other branches or tags (like 4.2.0)
Revert commit 7f9463bb54f19e7676f8c6049d1ebc02330a730f which make DevCloud not working on Apache CloudStack 4.2 branch.
[root@weizhou-centos testing(4.2)]# git show 7f9463bb54f19e7676f8c6049d1ebc02330a730f commit 7f9463bb54f19e7676f8c6049d1ebc02330a730f Author: Anthony Xu <firstname.lastname@example.org>; Date: Tue Dec 3 01:36:24 2013 -0800 put shell scripts to a seperate directory in XS use same scripts for both XS and XCP [root@weizhou-centos testing(4.2)]# git revert 7f9463bb54f19e7676f8c6049d1ebc02330a730f
(6) Compile Apache CloudStack source code, deploy database, and run the management server
mvn -P developer,systemvm clean install mvn -P developer -pl developer,tools/devcloud –Ddeploydb mvn -pl :cloud-client-ui jetty:run
Now we can see the Apache CloudStack UI on http://192.168.56.2:8080/client (username:admin, password:password)
(7) Change some global configuration in Apache CloudStack, and restart management server. Or you can change by MySQL:
mysql -e "update cloud.configuration set value='192.168.56.2' where name='host'"; # the value should be the ip of WORK-VM. mysql -e "update cloud.configuration set value='10' where name='cpu.overprovisioning.factor'"; mvn -pl :cloud-client-ui jetty:run
3. DevCloud deployment and testing
(8) Start DevCloud in VirtualBox. And run the following command in WORK-VM for testing Apache CloudStack 4.2 and newer.
mkdir /mnt/secondary mount 192.168.56.10:/opt/storage/secondary /mnt/secondary wget http://download.cloud.com/templates/4.2/systemvmtemplate-2013-07-12-master-xen.vhd.bz2 -O /root/systemvmtemplate-2013-07-12-master-xen.vhd.bz2 ./client/target/generated-webapp/WEB-INF/classes/scripts/storage/secondary/cloud-install-sys-tmplt -m /mnt/secondary -f /root/systemvmtemplate-2013-07-12-master-xen.vhd.bz2 -h xenserver -F
This is because the system VM (System Virtual Machines)  template changed between Apache CloudStack 4.1 and 4.2. So the old system VM template inside DevCloud is no longer valid when we test Apache CloudStack 4.2. These commands download the new system VM template and install it to Secondary Storage (NFS inside DevCloud).
After this, take a snapshot of DevCloud in VirtualBox, so that we do not need to update systemvm template any more. Each time when we want a clean DevCloud, we can restore the snapshot.
(9) Using Marvin to deploy DevCloud. Open another session and run the following commands:
cd tools/marvin python setup.py install # run only the first time. Check python-devel package if fails cd ../../ mvn -P developer -pl tools/devcloud -Ddeploysvr # Basic Network
If you want to use other type of networks, you can replace the last command with one of the following commands.
python tools/marvin/marvin/deployDataCenter.py -i tools/devcloud/devcloud.cfg # Basic Network, same to before python tools/marvin/marvin/deployDataCenter.py -i tools/devcloud/devcloud-advanced.cfg # Advanced Network python tools/marvin/marvin/deployDataCenter.py -i tools/devcloud/devcloud-advancedsg.cfg # Advanced with Security Groups
(10) After Step (9), a Zone/Pod/Cluster have been created, and DevCloud has been added as a host. After a few minutes, we can see that the system VMs are running on Apache CloudStack UI -> Infrastructure -> System VMs.
(11) Now we can deploy a VM on Apache CloudStack UI -> Instances -> Add Instance -> Template -> select “tty Linux” -> select “tinyOffering” -> next . After a few minutes, the VM will be up.
A virtual router (for default network) is also running.
4. Limitation and future work
Now we have an testing environment with Apache CloudStack 4.2. We can test the functionalities in CloudStack like virtual machine operations, network, template, domain/account.
However, in this environment, we have only one host (devcloud) with local storage (this means the volumes of virtual machines are stored on the host, not shared storage, so virtual machines live migration is disabled). In the next post, I will introduce how to test with multiple devcloud hosts, and shared storage (like NFS).
(1) It is better for testing Apache CloudStack 4.2. The 4.3/master branch have not been tested.
(2) If you are new to CloudStack, you can get some concepts from Apache CloudStack Installation Guide  and Apache CloudStack Admin Guide . Please note a new type of network (Advanced Network with Security Groups) was introduced in Apache CloudStack 4.2.0.
(3) You can use XCP command lines  to manage virtual machines inside DevCloud. For example:
root@devcloud:~# xe vm-list uuid ( RO) : 576aacc8-4c8e-e0b4-f035-79001b4a7284 name-label ( RW): r-4-VM power-state ( RO): running uuid ( RO) : 1efad534-bcd5-c183-9bfa-5eaf4a4afe80 name-label ( RW): i-2-3-VM power-state ( RO): running uuid ( RO) : c8c2f1a3-40d3-308f-70bf-687f7f49b9a5 name-label ( RW): Control domain on host: devcloud power-state ( RO): running uuid ( RO) : 61721ac5-c139-de00-c167-9e2edda49471 name-label ( RW): v-2-VM power-state ( RO): running uuid ( RO) : 464b1a57-1d82-eb33-b8da-93f029289389 name-label ( RW): s-1-VM power-state ( RO): running
(4) You can find more details in log files:
1. vmops.log in testing directory (WORK-VM).
2. /var/log/xcp-xapi.log inside DevCloud.
(5) If you want to attach the git branch name to directory path, please follow the article: “Git tip: Show your branch name on the Linux prompt”
(6) If we change some source codes, but now willing to build all projects as it take a long time. We can build the specified projects using maven.
mvn –P developer –pl api,server # if you want to re-build api and server projects cp ./api/target/cloud-api-4.2.1-SNAPSHOT.jar ./client/target/cloud-client-ui-4.2.1-SNAPSHOT/WEB-INF/lib/cloud-api-4.2.1-SNAPSHOT.jar cp ./server/target/cloud-server-4.2.1-SNAPSHOT.jar ./client/target/cloud-client-ui-4.2.1-SNAPSHOT/WEB-INF/lib/cloud-server-4.2.1-SNAPSHOT.jar
If you want to re-build systemvm.iso which is attached to system VMs when they start.
mvn -P developer,systemvm -pl patches/,services/console-proxy/,services/console-proxy/server/ cp ./services/console-proxy/server/dist/systemvm.iso ./client/target/cloud-client-ui-4.2.1-SNAPSHOT/WEB-INF/classes/vms/systemvm.iso scp ./services/console-proxy/server/dist/systemvm.iso 192.168.56.10:/usr/share/xcp/packages/iso/systemvm.iso