Created
February 15, 2012 16:06
-
-
Save devoid/1836940 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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