Skip to content

Instantly share code, notes, and snippets.

@devoid
Created February 15, 2012 16:06
Show Gist options
  • Save devoid/1836940 to your computer and use it in GitHub Desktop.
Save devoid/1836940 to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
## Boot a Managed Jenkins Slave
#
#
#
#
import os
from argparse import ArgumentParser
from subprocess import call
import sys
import tempfile
import novaclient.v1_1.client as novaclient
finalCloudInit = """
echo "Installing Jenkins dependencies"
sudo perl -i -pe 's/us\.archive\.ubuntu\.com/mirror\.anl\.gov/g'
sudo apt-get update
sudo apt-get install -y openjdk-7-jre openjdk-7-jdk openjdk-7-doc
echo "Downloading Jenkins slave jar from {}"
curl http://{}/jnlpJars/slave.jar > slave.jar
java -jar slave.jar
"""
# get novarc configuration
usr = os.environ['NOVA_USERNAME']
pwd = os.environ['NOVA_PASSWORD']
prj = os.environ['NOVA_PROJECT_ID']
url = os.environ['NOVA_URL']
# parse arguments
parser = ArgumentParser(description="Foo")
parser.add_argument('--image', dest='image', type=str, default='kbase-image-v4',
help="Image name of the image you want")
parser.add_argument('--flavor', dest='flavor', type=str, default="m1.small",
help="Instance flavor that you want")
parser.add_argument('--key', dest='key', type=str, default="jenkins",
help="Root ssh key that you want")
parser.add_argument('--init', default=[], dest='cloudInits',
type=str, action='append', help="A cloudInit script you want run")
parser.add_argument('--group', default=['default'], dest='groups',
type=str, action='append', help="Add a group")
parser.add_argument('--jenkins', default='ci.kbase.us', dest='hostname',
help='Address of the jenkins server (e.g. 10.0.0.1 or ci.kbase.us)')
parser.add_argument('instanceName', metavar='N', type=str, nargs=1,
help='Name of newly created instance')
nt = novaclient.Client(usr, pwd, prj, url, insecure=True)
args = parser.parse_args()
print args
# convert nova image and flavor names to
# nova IDs for these
myImage = None
myFlavor = None
for image in nt.images.list():
if(image.name == args.image):
myImage = image
for flavor in nt.flavors.list():
if(flavor.name == args.flavor):
myFlavor = flavor
# Build the basic arguments to nova boot
callArgs = ["nova", "--insecure", "boot", "--flavor", str(myFlavor.id)]
if(myImage != None):
callArgs.extend(["--image", str(myImage.id)])
if(len(args.cloudInits) > 0):
callArgs.extend(["--file", args.myCloudInits[0]])
if(len(args.groups) > 0):
callArgs.extend(["--security_groups", ','.join(args.groups)])
if(args.key != None):
callArgs.extend(["--key_name", args.key])
# Build final cloud-init script based on passed arguments
# plus the finalCloudInit .format(hostname)
tmpFile = tempfile.NamedTemporaryFile(delete=False)
for cloudInit in args.cloudInits:
lines = open(cloudInit, "r").read()
tmpFile.write(lines)
tmpFile.write(finalCloudInit.format(args.hostname, args.hostname))
tmpFile.close()
callArgs.extend(["--file", "boot.sh=" + tmpFile.name])
callArgs.extend(args.instanceName)
print " ".join(callArgs)
call(callArgs)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment