Experimental Joyent SmartDataCenter 6.5 & 7.0 CloudAPI connector using http-signature authentication via Requests


Keywords
http, web, joyent, admin, operations
License
MIT
Install
pip install smartdc==0.2.0

Documentation

Python SmartDataCenter

Connect with Joyent's SmartDataCenter CloudAPI via Python, using secure http-signature signed requests. It enables you to programmatically provision and otherwise control machines within Joyent's public cloud.

This is a third-party effort.

This module currently supports:

  • Secure connections (via http_signature and optionally, ssh-agent)
  • Key management
  • Browsing and access of datacenters, datasets (OS distributions/VM bundles), and packages (machine sizes and resources)
  • Machine listing, search, creation, management (start/stop/reboot/resize/delete), snapshotting, metadata, and tags
  • Installing boot scripts on machines

It attempts to provide Pythonic objects (for Data Centers, Machines and Snapshots) and convenience methods only when appropriate, and otherwise deals with string identifiers or dicts as lightweight objects.

Requirements

Optional:

  • ssh or paramiko (post-1.8.0) (used by http_signature for its ssh-agent integration)

We assume that json is present because requests now requires py2.6 and up.

Python SmartDataCenter Links

Installation

pip install smartdc

Quickstart

This requires a Joyent Public Cloud account with valid payment information and at least one SSH key uploaded. The example as presented should cost a maximum of 0.01USD:

from smartdc import DataCenter

sdc = DataCenter(location='us-sw-1', key_id='/accountname/keys/keyname')

sdc.datasets()

sm = sdc.create_machine(name='test', dataset='sdc:sdc:standard:1.0.7',
      package='g3-standard-0.25-smartos')

sm.poll_until('running')

import urllib2

urllib2.urlopen('http://' + sm.public_ips[0]).headers.dict

sm.stop()

sm.poll_until('stopped')

sm.delete()

Connecting with Telefónica's InstantServers:

from smartdc import DataCenter, TELEFONICA_LOCATIONS

mad = DataCenter(location='eu-mad-1',
              known_locations=TELEFONICA_LOCATIONS,
              key_id='/accountname/keys/keyname')

mad.default_package()

Why?

A colleague and I wanted something Pythonic to fit into our preferred toolchain, and the easiest approach was to build it myself. Requests made some aspects stupidly easy, which is why I created the dependency for the first version. The colleague wanted integration with ssh-agent, and using ssh was the easiest path to that.

Authors

Adam T. Lindsay

License

MIT