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
+
+