Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.

===========================================================

NOTE - This folder is a work in progress.  The project has not determined
how to best establish a nightly DevCloud build process, or how to distribute
the image.

===========================================================
Contents:

This folder contains various scripts used to build the devcloud image.
devcloudsetup.sh - the origional devcloud build script (assumes an Ubuntu 12.04 VM image)

build_vagrant_basebox.sh - a script that uses VirtualBox, VeeWee, Vagrant (patched) and puppet to create a devcloud basebox
veewee - configuration files used to build a basic Ubuntu 12.04 vagrant box via VeeWee
basebuild - The Vagrantfile and puppet module that gets applied to the basic Ubuntu 12.04 box
devcloudbox - The Vagrantfile and puppet module that is used with the [hopefully] distributed devcloud base box

===========================================================
Instructions:

To build a "devcloud base box", run you need a system with VirtualBox and rvm
installed (use ruby 1.9.2).  Run build_vagrant_basebox.sh to build the base box.

To use the "devcloud base box" that is created in the previous step, you
need to have installed a forked version of Vagrant (until we make the changes
plugins instead of direct source patches) that can be found here:


Once installed per the Vagrant installation process, run:

vagrant box add devcloud [path to devcloud.box]

Then, either go into the devcloudbox folder of your checked out 
version of the CloudStack code (incubator-cloudstack/tools/devcloud/devcloudbox),
or copy the contents of that folder to another location.

Assuming the patched Vagrant installation is working, you then
simply run "vagrant up" from within that directory.

