Initial commit
diff --git a/scripts/create-vms.sh b/scripts/create-vms.sh
new file mode 100755
index 0000000..eebd038
--- /dev/null
+++ b/scripts/create-vms.sh
@@ -0,0 +1,24 @@
+#!/bin/bash
+
+function create-vm {
+	NAME=$1
+	CPU=$2
+	MEM_MB=$3
+	DISK_GB=$4
+	uvt-kvm list | grep $1
+	if [ "$?" -ne "0" ]
+	then
+		uvt-kvm create $NAME --cpu=$CPU --memory=$MEM_MB --disk=$DISK_GB
+	fi
+}
+
+create-vm juju 1 2048 20
+create-vm mysql 2 4096 40
+create-vm rabbitmq-server 2 4096 40
+create-vm keystone 2 4096 40
+create-vm glance 2 4096 160
+create-vm nova-cloud-controller 2 4096 40
+create-vm quantum-gateway 2 4096 40
+create-vm openstack-dashboard 1 2048 20
+create-vm ceilometer 1 2048 20
+create-vm nagios 1 2048 20
diff --git a/scripts/juju-compute-relations.py b/scripts/juju-compute-relations.py
new file mode 100755
index 0000000..49d0cdc
--- /dev/null
+++ b/scripts/juju-compute-relations.py
@@ -0,0 +1,56 @@
+#!/usr/bin/python
+
+import subprocess
+import time
+import argparse
+
+sleep_interval = 1
+
+relations = [
+    "nova-compute:shared-db mysql:shared-db",
+    "nova-compute:amqp rabbitmq-server:amqp",
+    "nova-compute glance",
+    "nova-compute nova-cloud-controller",
+    "ntp nova-compute",
+    "nova-compute nagios",
+    "nova-compute nrpe",
+    "nova-compute:nova-ceilometer ceilometer-agent:nova-ceilometer",
+    ]
+
+def addrelation(relation):
+    subprocess.check_call("juju add-relation %s" % relation, shell=True)
+
+def destroyrelation(relation):
+    subprocess.check_call("juju destroy-relation %s" % relation, shell=True)
+
+def addrelations():
+    for relation in relations:
+        print "Adding relation %s" % relation
+        try:
+            addrelation(relation)
+            time.sleep(sleep_interval)
+        except:
+            pass
+            
+def destroyrelations():
+    for relation in relations:
+        print "Destroying relation %s" % relation
+        try:
+            destroyrelation(relation)
+            time.sleep(sleep_interval)
+        except:
+            pass
+
+def main():
+    parser = argparse.ArgumentParser(description='Deploy OpenStack controller services')
+    parser.add_argument('--destroy', action='store_true',
+                       help='Destroy the relations instead of adding them')
+
+    args = parser.parse_args()
+    if args.destroy:
+        destroyrelations()
+    else:
+        addrelations()
+        
+if  __name__ =='__main__':
+    main()
diff --git a/scripts/juju-compute-setup.py b/scripts/juju-compute-setup.py
new file mode 100755
index 0000000..cc62b50
--- /dev/null
+++ b/scripts/juju-compute-setup.py
@@ -0,0 +1,65 @@
+#!/usr/bin/python
+
+import subprocess
+import json
+import time
+
+jujuconfig="/home/ubuntu/openstack.cfg"
+
+services = {
+    "nova-compute" : "--config=%s cs:~andybavier/trusty/nova-compute" % jujuconfig,
+}
+
+def get_free_machines(status):
+    for (service, svcinfo) in status['services'].iteritems():
+        if 'units' in svcinfo:
+            for (unit, unitinfo) in svcinfo['units'].iteritems():
+                if 'machine' in unitinfo:
+                    machine = unitinfo['machine']
+                    status['machines'][machine]['unit'] = unit
+
+    free = {}
+    for (machine, mchinfo) in status['machines'].iteritems():
+        if machine == "0":
+            continue
+
+        if 'unit' not in mchinfo:
+            # print "%s: %s" % (machine, mchinfo['dns-name'])
+            free[machine] = mchinfo
+
+    return free
+                
+
+def deploy(status, service, cmd):
+    # Deploy nova-compute to all free machines
+    machines = get_free_machines(status)
+    
+    for (machine, mchinfo) in machines.iteritems():
+        if service in status['services']: 
+            print "Adding unit %s on %s" % (service, mchinfo['dns-name'])
+            subprocess.check_call("juju add-unit --to=%s %s" % (machine, service), shell=True)
+        else:
+            print "Deploying service %s on %s" % (service, mchinfo['dns-name'])
+            subprocess.check_call("juju deploy --to=%s %s" % (machine, cmd), shell=True)
+            status['services'][service] = "installed"
+            time.sleep(10)
+
+def get_juju_status():
+    output = subprocess.check_output("juju status --format=json", shell=True)
+    status = json.loads(output)
+    return status
+
+def addservices():
+    status = get_juju_status()
+
+    for service, cmd in services.iteritems():
+        try:
+            deploy(status, service, cmd)
+        except:
+            pass
+
+def main():
+    addservices()
+
+if  __name__ =='__main__':
+    main()
diff --git a/scripts/juju-relations.py b/scripts/juju-relations.py
new file mode 100755
index 0000000..1be59ab
--- /dev/null
+++ b/scripts/juju-relations.py
@@ -0,0 +1,80 @@
+#!/usr/bin/python
+
+import subprocess
+import time
+import argparse
+
+sleep_interval = 1
+
+relations = ["keystone mysql",
+             "nova-cloud-controller mysql",
+             "nova-cloud-controller rabbitmq-server",
+             "nova-cloud-controller glance",
+             "nova-cloud-controller keystone",
+             "glance mysql",
+             "glance keystone",
+             "quantum-gateway mysql",
+             "quantum-gateway rabbitmq-server",
+             "quantum-gateway nova-cloud-controller",
+             "openstack-dashboard keystone",
+             "ntp nova-cloud-controller",
+             "mysql nagios",
+             "rabbitmq-server nagios",
+             "keystone nagios",
+             "glance nagios",
+             "nova-cloud-controller nagios",
+             "quantum-gateway nagios",
+             "openstack-dashboard nagios",
+             "nagios nrpe",
+             "mysql nrpe",
+             "rabbitmq-server nrpe",
+             "keystone nrpe",
+             "glance nrpe",
+             "nova-cloud-controller nrpe",
+             "quantum-gateway nrpe",
+             "openstack-dashboard nrpe",
+             "ceilometer mongodb",
+             "ceilometer rabbitmq-server",
+             "ceilometer:identity-service keystone:identity-service",
+             "ceilometer:ceilometer-service ceilometer-agent:ceilometer-service",
+             "ceilometer nagios",
+             "ceilometer nrpe",
+             ]
+
+def addrelation(relation):
+    subprocess.check_call("juju add-relation %s" % relation, shell=True)
+
+def destroyrelation(relation):
+    subprocess.check_call("juju destroy-relation %s" % relation, shell=True)
+
+def addrelations():
+    for relation in relations:
+        print "Adding relation %s" % relation
+        try:
+            addrelation(relation)
+            time.sleep(sleep_interval)
+        except:
+            pass
+            
+def destroyrelations():
+    for relation in relations:
+        print "Destroying relation %s" % relation
+        try:
+            destroyrelation(relation)
+            time.sleep(sleep_interval)
+        except:
+            pass
+
+def main():
+    parser = argparse.ArgumentParser(description='Deploy OpenStack controller services')
+    parser.add_argument('--destroy', action='store_true',
+                       help='Destroy the relations instead of adding them')
+
+    args = parser.parse_args()
+    if args.destroy:
+        destroyrelations()
+    else:
+        addrelations()
+        
+if  __name__ =='__main__':
+    main()
diff --git a/scripts/juju-setup.py b/scripts/juju-setup.py
new file mode 100755
index 0000000..f9bb0ac
--- /dev/null
+++ b/scripts/juju-setup.py
@@ -0,0 +1,77 @@
+#!/usr/bin/python
+
+import subprocess
+import json
+import socket
+
+jujuconfig="openstack.cfg"
+
+# Assumption: VMs have same hostname as service that runs inside
+machines = ["mysql", "rabbitmq-server", "keystone", "glance", "nova-cloud-controller",
+            "quantum-gateway", "openstack-dashboard", "ceilometer", "nagios"]
+
+services = {
+    "mysql" : "mysql",
+    "rabbitmq-server" : "rabbitmq-server",
+    "keystone" : "--config=%s keystone" % jujuconfig,
+    "glance" : "--config=%s glance" % jujuconfig,
+    "nova-cloud-controller" : "--config=%s cs:~andybavier/trusty/nova-cloud-controller" % jujuconfig,
+    "quantum-gateway" : "--config=%s cs:~andybavier/trusty/quantum-gateway" % jujuconfig,
+    "openstack-dashboard" : "--config=%s openstack-dashboard" % jujuconfig,
+    "nagios" : "nagios",
+    "mongodb" : "mongodb",   # deploy to ceilometer machine
+    "ceilometer" : "ceilometer",
+    "nrpe" : "nrpe",
+    "ntp" : "ntp",
+    "ceilometer-agent" : "ceilometer-agent"
+}
+
+# Figure out Juju ID of machine we should install on
+def get_machine(status, service):
+    if service == "mongodb":
+        service = "ceilometer"
+    for key, value in status['machines'].iteritems():
+        (hostname, aliaslist, ipaddrlist) = socket.gethostbyaddr(value['dns-name'])
+        if hostname == service:
+            return key
+    return None
+
+def deploy(status, service, cmd):
+    if service in status['services']:
+        return
+
+    print "Installing %s" % service
+    machine = get_machine(status, service)
+    if machine:
+        subprocess.check_call("juju deploy --to=%s %s" % (machine, cmd), shell=True)
+    else:
+        subprocess.check_call("juju deploy %s" % cmd, shell=True)
+
+def get_juju_status():
+    output = subprocess.check_output("juju status --format=json", shell=True)
+    status = json.loads(output)
+    return status
+
+def addservices():
+    status = get_juju_status()
+
+    for service, cmd in services.iteritems():
+        try:
+            deploy(status, service, cmd)
+        except:
+            pass
+
+def addmachines():
+    status = get_juju_status()
+
+    for machine in machines:
+        if get_machine(status, machine) == None:
+            ipaddr = socket.gethostbyname(machine)
+            subprocess.check_call("juju add-machine ssh:%s" % ipaddr, shell=True)
+
+def main():
+    addmachines()
+    addservices()
+
+if  __name__ =='__main__':
+    main()
diff --git a/scripts/network-setup.sh b/scripts/network-setup.sh
new file mode 100755
index 0000000..efa35fc
--- /dev/null
+++ b/scripts/network-setup.sh
@@ -0,0 +1,26 @@
+#!/bin/sh
+
+source ~/admin_openrc.sh
+
+# Create nat-net network
+neutron net-show nat-net 2&>1 > /dev/null
+if [ "$?" -ne 0 ]
+then
+    neutron net-create --provider:physical_network=nat --provider:network_type=flat --shared nat-net
+fi
+
+# Create nat-net subnet
+neutron subnet-show nat-net 2&>1 > /dev/null
+if [ "$?" -ne 0 ]
+then
+    neutron subnet-create nat-net --name nat-net 172.16.0.0/16 --gateway=172.16.0.1 --enable-dhcp=false
+fi
+
+# Create nat-net network
+neutron net-show ext-net 2&>1 > /dev/null
+if [ "$?" -ne 0 ]
+then
+    neutron net-create --provider:physical_network=ext --provider:network_type=flat --shared ext-net
+fi
+
+