This document describes how to develop, build, package and install Apache
CloudStack. For more information please refer to:

    http://cloudstack.apache.org

Apache CloudStack developers use various platforms for development, this guide
was tested against a CentOS 6.2 x86_64 setup.

Refer to the [wiki](http://cwiki.apache.org/confluence/display/CLOUDSTACK/Index)
for the latest information, especially:

  - [Setting up development environment](https://cwiki.apache.org/confluence/display/CLOUDSTACK/Setting+up+CloudStack+Development+Environment) for Apache CloudStack.
  - [Building](https://cwiki.apache.org/confluence/display/CLOUDSTACK/How+to+build+CloudStack) Apache CloudStack.

## Setting up Development Environment

### Installing Tools and Dependencies

Install tools and dependencies used for development:

    $ yum install git ant ant-devel java-1.7.0-openjdk java-1.7.0-openjdk-devel
    mysql mysql-server tomcat6 mkisofs gcc python MySQL-python openssh-clients wget

Set up Maven (3.0.5):

    $ wget http://www.us.apache.org/dist/maven/maven-3/3.0.5/binaries/apache-maven-3.0.5-bin.tar.gz
    $ cd /usr/local/ # or any path
    $ tar -zxvf apache-maven-3.0.5-bin.tar.gz
    $ echo export M2_HOME=/usr/local/apache-maven-3.0.5 >> ~/.bashrc # or .zshrc or .profile
    $ echo export PATH=${M2_HOME}/bin:${PATH} >> ~/.bashrc # or .zshrc or .profile

Note: Tomcat 6.0.35 has some known issue with Apache CloudStack, please use Tomcat
6.0.33 from http://archive.apache.org/dist/tomcat/tomcat-6/v6.0.33/bin

### Configure Environment

Set CATALINA_HOME to path where you extract/install tomcat, put them in your
.bashrc or .zshrc or .profile:

    $ echo export CATALINA_HOME=/usr/share/tomcat6/ >> ~/.bashrc

Fix permissions on CATALINA_HOME:

    $ chown -R <you>:<your-group> $CATALINA_HOME

Generate you ssh keys, useful for ssh-ing to your hosts and vm etc.:

    $ ssh-keygen -t rsa -q

Apache CloudStack uses some ports, make sure at least those used by the management
server are available and not blocked by any local firewall. Following ports are
used by Apache CloudStack and its entities:

    8080: API Server (authenticated), browser or CLI client to management server
    8096: API Server (unauthenticated), browser or CLI client to management server
    8787: Remote java debug debugging port, from IDE to management server
    9090: Management server to management server (cluster)
    7080: AWS API Server to which an AWS client can connect
    80/443: HTTP client to Secondary Storage VM (template download)
    111/2049: Secondary Storage to NFS server
    3922: Port used to ssh/scp into system vms (SSVM, CPVM, VR)
    8250: Agent (SSVM, CPVM, VR) to management server
    22, 80, 443: XenServer, XAPI
    22: KVM
    443: vCenter
    53: DNS
    111/2049: NFS
    3306: MySQL Server to which the management server connects

### Configuring MySQL Server

Start the MySQL service:

    $ service mysqld start

### Getting the Source Code

You may get the source code from the repository hosted on Apache:

    $ git clone git://git.apache.org/cloudstack.git

Or, you may fork a repository from the official Apache CloudStack mirror by
Apache on [Github](https://github.com/apache/cloudstack)

To keep yourself updated on a branch, do:

    $ git pull <origin> <branch>

For example, for master:

    $ git pull origin master

## Building

Clean and build:

    $ mvn clean install -P systemvm,developer

CloudStack supports several plugins that depend on libraries with distribution restrictions. 
Because of this they are not included in the default build. Enable these additional plugins 
activate their respective profiles. For convenience adding -Dnoredist will enable all plugins
that depend on libraries with distribution restrictions. The build procedure expects that the 
required libraries are present in the maven repository. 

The following procedure can be used to add the libraries to the local maven repository. Details 
on obtaining the required libraries can be found in this file. Note that this will vary between
releases of cloudstack

    $ cd deps
    $ ./install-non-oss.sh

To build all non redistributable components, add the noredist flag to the build command:

    $ mvn clean install -P systemvm,developer -Dnoredist

Clear old database (if any) and deploy the database schema:

    $ mvn -P developer -pl developer -Ddeploydb

Export the following variable if you need to run and debug the management server:

    $ export MAVEN_OPTS="-Xmx1024m -XX:MaxPermSize=500m -Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n"

Start the management server:

    $ mvn -pl :cloud-client-ui jetty:run

If this works, you've successfully setup a single server Apache CloudStack installation.

Open the following URL on your browser to access the Management Server UI:

    http://localhost:8080/client/

Or,

    http://management-server-ip-address:8080/client

The default credentials are; user: admin, password: password and the domain
field should be left blank which is defaulted to the ROOT domain.

If you want to contribute your changes, send your [git formatted patch](https://cwiki.apache.org/confluence/display/CLOUDSTACK/Git) to:
https://reviews.apache.org/groups/cloudstack or contact on the developer mailing list.

## Packaging and Installation

Before packaging, please make sure you go through the "Building" section above.
This section describes packaging and installation.

### Debian/Ubuntu

To create debs:

    $ mvn -P deps # -D noredist, for noredist as described in the "Building" section above
    $ dpkg-buildpackage

All the deb packages will be created in ../$PWD

To create an apt repo: (assuming appropriate user privileges)

    $ path=/path/to/your/webserver/cloudstack
    $ mv ../*.deb $path
    $ dpkg-scanpackages $path /dev/null | gzip -9c > $path/Packages.gz

Configure your system to use your new apt repo:

    $ echo "deb $path ./" >> /etc/apt/sources.list.d/cloudstack.list

Installation:

Install needed packages, apt-get upgrade for upgrading:

    $ apt-get update
    $ apt-get install cloud-client                   # management server
    $ apt-get install mysql-server                   # mysql server
    $ apt-get install cloud-agent cloud-system-iso   # agent (kvm)
    $ apt-get install cloud-awsapi                   # awsapi server
    $ apt-get install cloud-usage                    # usage server

### RHEL/CentOS

To create rpms:

    $ cd packaging/centos63
    $ bash packaging.sh [ -p NOREDIST ]

All the rpm packages will be create in dist/rpmbuild/RPMS/x86_64

To create a yum repo: (assuming appropriate user privileges)

    $ path=/path/to/your/webserver/cloudstack
    $ cd dist/rpmbuild/RPMS/x86_64
    $ mv *.rpm $path
    $ createrepo $path

Configure your system to use your new yum repo, add the following to /etc/yum.repos.d/cloudstack.repo:

    [apache-cloudstack]
    name=Apache CloudStack
    baseurl=http://webserver.tld/path/to/repo
    enabled=1
    gpgcheck=0

Installation:

Install needed packages:

    $ yum update
    $ yum install cloudstack-management                       # management server
    $ yum install mysql-server                       # mysql server
    $ yum install cloudstack-agent                        # agent (kvm)
    $ yum install cloudstack-usage                        # usage server

## Installing CloudMonkey CLI

CloudMonkey is a CLI for Apache CloudStack. It was earlier in `tools/cli` within
the source code but now it has its own repository:

    https://git-wip-us.apache.org/repos/asf?p=cloudstack-cloudmonkey.git

## Notes

If you will be using Xen as your hypervisor, please download [vhd-util](http://download.cloud.com.s3.amazonaws.com/tools/vhd-util)

If management server is installed on RHEL/CentOS, then copy vhd-util into:
/usr/lib64/cloud/common/scripts/vm/hypervisor/xenserver/

If management server is installed on Ubuntu, then put vhd-util into:
/usr/lib/cloud/common/scripts/vm/hypervisor/xenserver/vhd-util

Once, you've successfully installed Apache CloudStack you may read the user manuals
and guides which contains technical documentation for Apache CloudStack.
