import time, sys import json from smartdc import DataCenter import paramiko sdc = DataCenter('eu-ams-1', key_id='/username/keys/keyname', verbose=True) ipc = sdc.create_machine(dataset='sdc:sdc:base64:', package='Extra Small 512 MB', tags={'cluster': 'ipython', 'role': 'controller'}, boot_script='./startup-controller.sh', name='ipcontroller') ipc.poll_until('running') def wait_for_svc(connection, fmri, interval=3, timeout=315): SERVICE_POLL = 'svcs -H -o STA,NSTA %s' % fmri for _ in xrange(timeout//interval): states = tuple(connection.exec_command(SERVICE_POLL)[1].read().strip().split()) if states == ('ON', '-'): print >>sys.stderr return True elif states == ('MNT', '-'): raise StandardError('Bootscript failed: now in maintenance mode') elif states == ('OFF', 'ON'): # heartbeat print >>sys.stderr, '.', else: # slightly unusual state print >>sys.stderr, '?', time.sleep(interval) raise StandardError('Timeout') ssh_conn = paramiko.SSHClient() ssh_conn.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh_conn.connect(ipc.public_ips[0], username='root') wait_for_svc(ssh_conn, 'svc:/smartdc/mdata:execute') _, rout, _ = ssh_conn.exec_command('cat /opt/local/share/ipython/profile_default/security/ipcontroller-engine.json') ipcontroller = json.load(rout) for _ in xrange(4): sdc.create_machine(dataset='sdc:sdc:base64:', package='Extra Small 512 MB', metadata={'ipython.url': ipcontroller['url'], 'ipython.key': ipcontroller['exec_key']}, tags={'cluster': 'ipython', 'role': 'engine'}, boot_script='./startup-engine.sh') ipc.public_ips ssh_conn.close() cluster = sdc.machines(tags={'cluster': 'ipython'}) cluster from operator import methodcaller map(methodcaller('stop'), cluster) map(methodcaller('poll_until', 'stopped'), cluster) map(methodcaller('delete'), cluster) sdc.machines()