#!/usr/bin/env python
import getopt, sys, imp
import boto
from boto.utils import get_instance_userdata
def usage():
print 'SYNOPSIS'
print '\tstart_service.py -m module -c class_name [-r] [-p] [-a ami_id] [-e email_address] [-k key_name] [-l log_queue_name] [-n num_instances] [-w working_dir] [-i input_queue_name] [-o output_queue_name]'
sys.exit()
def get_userdata(params):
module_name = None
class_name = None
d = get_instance_userdata(sep='|')
params.update(d)
def find_class(params):
modules = params['module_name'].split('.')
path = None
for module_name in modules:
fp, pathname, description = imp.find_module(module_name, path)
module = imp.load_module(module_name, fp, pathname, description)
if hasattr(module, '__path__'):
path = module.__path__
return getattr(module, params['class_name'])
def main():
try:
opts, args = getopt.getopt(sys.argv[1:], 'a:c:e:hi:k:l:m:n:o:prw:',
['ami', 'class', 'email', 'help',
'inputqueue', 'keypair', 'logqueue',
'module', 'numinstances', 'outputqueue',
'persist', 'remote', 'working_dir'])
except:
usage()
params = {'module_name' : None,
'class_name' : None,
'notify_email' : None,
'input_queue_name' : None,
'output_queue_name' : None,
'log_queue_name' : None,
'working_dir' : None,
'keypair' : None,
'on_completion' : 'shutdown',
'ami' : None}
remote = None
ami = None
for o, a in opts:
if o in ('-a', '--ami'):
params['ami'] = a
if o in ('-c', '--class'):
params['class_name'] = a
if o in ('-e', '--email'):
params['notify_email'] = a
if o in ('-h', '--help'):
usage()
if o in ('-i', '--inputqueue'):
params['input_queue_name'] = a
if o in ('-k', '--keypair'):
params['keypair'] = a
if o in ('-l', '--logqueue'):
params['log_queue_name'] = a
if o in ('-m', '--module'):
params['module_name'] = a
if o in ('-n', '--num_instances'):
params['num_instances'] = int(a)
if o in ('-o', '--outputqueue'):
params['output_queue_name'] = a
if o in ('-p', '--persist'):
params['on_completion'] = 'persist'
if o in ('-r', '--remote'):
remote = True
if o in ('-w', '--working_dir'):
params['working_dir'] = a
if remote:
# check required fields
required = ['module_name', 'class_name', 'input_queue_name',
'output_queue_name', 'ami']
for pname in required:
if pname not in params.keys():
print '%s is required' % pname
usage()
# we have everything we need, now build userdata string
l = []
for k, v in params.items():
if v:
l.append('%s=%s' % (k, v))
c = boto.connect_ec2()
l.append('aws_access_key_id=%s' % c.aws_access_key_id)
l.append('aws_secret_access_key=%s' % c.aws_secret_access_key)
s = '|'.join(l)
if params['ami']:
rs = c.get_all_images([params['ami']])
img = rs[0]
r = img.run(user_data=s, key_name=params['keypair'],
max_count=params.get('num_instances', 1))
print 'Server: %s.%s - %s (Started)' % (params['module_name'],
params['class_name'],
params['ami'])
print 'Reservation %s contains the following instances:' % r.id
for i in r.instances:
print '\t%s' % i.id
else:
print '-a option is required'
usage()
else:
get_userdata(params)
cls = find_class(params)
s = cls(working_dir=params['working_dir'],
input_queue_name=params['input_queue_name'],
output_queue_name=params['output_queue_name'],
log_queue_name=params['log_queue_name'])
s.run()
if __name__ == "__main__":
main()
syntax highlighted by Code2HTML, v. 0.9.1