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()