ElasticHosts

ElasticHosts virtual servers come in sizes to suit all businesses, from a basic, but fully capable server from £29/$44 per month to high-end configurations with up to eight cores, 8 GB memory, 2 TB disk.

Our HTTP API allows users to create drives, upload and download drive images and create and control virtual servers on our infrastructure. The API works in a straightforward ReST style, and we also provide a simple command line tool, drive upload tool and drive download tool for Unix or Windows Cygwin users to control our infrastructure from their own scripts without writing any code.

Worked example

In only two commands, you can upload a drive image and boot a server. Here is the full input and output to do exactly this, using our simple command line tool and drive upload tool on Unix or Windows Cygwin. Each command corresponds a single API HTTP GET or POST, with the URL corresponding to the command line arguments, and the input and output data exactly as seen on the command line here.

      $ # Set API end-point for your availability zone
      $ # Substitute api.lon-b.elastichosts.com if your account is there.
      $ # Alternatively, you can hard-code the value of EHURI in your local
      $ # copy of the scripts.
      $ export EHURI=https://api.lon-p.elastichosts.com/
      $ # Set authentication credentials (from account profile)
      $ # Omit the secret key if you are running on a very old unix which leaks
      $ # the content of your environment to other users via 'ps e'. You will
      $ # then be interactively prompted for your secret key by curl.
      $ # Alternatively, you can hard-code the value of EHAUTH in your local
      $ # copy of the scripts, but make sure they aren't world-readable!
      $ export EHAUTH=<user uuid>:<secret API key>
      $ # Create drive and upload image
      $ # We use the drive upload tool to automatically upload in
      $ # gzipped chunks. A more basic upload with the raw API would be:
      $ # elastichosts -c drives create << EOF | grep drive
      $ # > name TestDrive
      $ # > size 10000000
      $ # > EOF
      $ # drive 08c92dd5-70a0-4f51-83d2-835919d254df
      $ # elastichosts -f image.raw drives 08c92dd5-70a0-4f51-83d2-835919d254df write
      $ elastichosts-upload image.raw
      Created drive 08c92dd5-70a0-4f51-83d2-835919d254df of size 10000000
      Uploading 2 chunks of 5242880 bytes: .. completed
      $ # Boot a server from the drive, with 2000 core MHz and 1024 MB RAM
      $ elastichosts -c servers create << EOF
      > name TestServer
      > cpu 2000
      > mem 1024
      > ide:0:0 08c92dd5-70a0-4f51-83d2-835919d254df
      > boot ide:0:0
      > nic:0:model e1000
      > nic:0:dhcp auto
      > vnc:ip auto
      > vnc:password XXXXXXXX
      > EOF
      server 85ef58c8-6f5d-4f7f-8f1c-0c19d45d7c1c
      name TestServer
      cpu 2000
      smp 1
      mem 1024
      ide:0:0 08c92dd5-70a0-4f51-83d2-835919d254df
      boot ide:0:0
      nic:0:dhcp 91.203.56.132
      nic:0:model e1000
      rx 0
      tx 0
      vnc:ip 91.203.56.132
      vnc:password XXXXXXXX
      

Using the API

The API is implemented in a ReST style, using the URL to specify an object and an action, HTTP GET to read state and HTTP POST to change state. In the description below, API URLs are relative to the stem https://api.lon-p.elastichosts.com/ where lon-p refers to the availability zone for our Peer 1 availability zone near London in the UK.

Users, drives and servers are identified by UUIDs, which are assigned by our infrastructure and passed as a string in the format XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.

Authentication

API calls must use HTTP Basic Authentication, specifying the user's UUID as the username and their secret API key as the password. Both are available from the user's account profile.

Data formats

The API can be used in either text/plain (default) or application/json modes. You should specify the type of input data with an HTTP Content-Type: header, and request a type for output with an HTTP Accept: header. text/plain is the default if no headers are set.

The API sends or receives one of three types of data, according to the call:

  text/plain application/json
Single object, key value pairs of properties

Multiple lines of text, each containing a key, followed by a space, followed by the value. e.g.:

            name TestServer
            cpu 4000
            mem 2048

Data is accompanied by the HTTP header 'X-Elastic-Output: properties'

JSON object. e.g.:

            {"name":"TestServer", "cpu":4000, "mem":2048}
            
Multiple objects, list of values

Multiple lines of text, each containing a space separated list of values for the same set of keys. e.g.:

            ip 192.168.0.1
            ip 192.168.0.2
            ip 192.168.0.3

Data is accompanied by the HTTP header 'X-Elastic-Output: list '

JSON array of objects. e.g.:

             [{"type":"ip", "resource":"192.168.0.1"},
              {"type":"ip", "resource":"192.168.0.2"},
              {"type":"ip", "resource":"192.168.0.3"}]
            
Multiple objects, key value pairs of properties for each

Multiple lines of text, each containing a key, followed by a space, followed by the value. Blank lines separating objects. e.g.:

            name TestServer1
            cpu 2000
            mem 1024
            name TestServer2
            cpu 4000
            mem 2048

Data is accompanied by the HTTP header 'X-Elastic-Output: properties list'

JSON array of objects. e.g.:

             [{"name":"TestServer1", "cpu":2000, "mem":1024},
              {"name":"TestServer2", "cpu":4000, "mem":2048}]
            

Errors

Errors are returned with an appropriate HTTP status code, an X-Elastic-Error header specifying the error type, and a text description in the HTTP body. The error types are:

HTTP status code X-Elastic-Error Meaning
200 OK n/a Command succeeded, data returned (possibly 0 length)
204 No Content n/a Command succeeded, no data returned (by definition)
400 Bad Request usage Invalid input data to command
401 Unauthorized auth HTTP Basic Authentication missing or incorrect
402 Payment Required billing Account balance and/or subscriptions do not cover command
404 Not Found missing Command, drive, server or other object not found
405 Method Not Allowed method GET used on command expecting POST
409 Conflict busy Drive, server or other resource is busy
500 Internal Server Error failed Failed command
500 Internal Server Error system System error
507 Insufficient Storage full Drive or other resource is full

Drive API

Standard drives

Pre-installed system images (gzipped)
UUID Description Size gunzipped
cf82519b-01a0-4247-aff5-a2dadf4401ad Debian Linux 4.0: Base system without X 1GB
e6111e4c-67af-4438-b1bc-189747d5a8e5 Debian Linux 5.0: Base system without X 1GB
bf1d943e-2a55-46bb-a8c7-6099e44a3dde Ubuntu Linux 8.10: Base system with X 3GB
757586d5-f1e9-4d9c-b215-5a391c9a24bf Ubuntu Linux 9.04: Base system with X 3GB
b9d0eb72-d273-43f1-98e3-0d4b87d372c0 Windows Web Server 2008 13GB
30824e97-05a4-410c-946e-2ba5a92b07cb Windows Web Server 2008 R2 13GB
9ecf810e-6ad1-40ef-b360-d606f0444671 Windows Web Server 2008 R2 + SQL Server 13GB
10a88d1c-6575-46e3-8d2c-7744065ea530 Windows Server 2008 Standard R2 13GB
2567f25c-8fb8-45c7-95fc-bfe3c3d84c47 Windows Server 2008 Standard R2 + SQL Server 13GB

CD / DVD ISOs
UUID Description
b86afe3a-b5dc-4184-9ef0-3a52dce63238 CentOS Linux 5.3 Install CD
ac646eda-62be-4366-8cc9-10afdf6506b5 CentOS Linux 5.4 Install CD
5f029de7-1729-486b-9bb3-65e326febb4d CentOS Linux 5.5 Install CD
adb59223-edcf-418f-a74c-8a9b4788e1d6 Debian Linux 5.0 Install CD
86f52611-567b-40b9-8db7-933ad4f483d7 FreeBSD 7.2 Install CD
a080dce0-2f28-4e42-9db6-1c5f410a3da8 FreeBSD 8.0 Install CD
a1cd7ea0-6539-4cb6-b35f-03c9a6b61917 Knoppix Linux 6.0.1 Live CD
b36bd91f-ce93-45c3-946a-d095018681c0 OpenSolaris 2009.06 Install CD
c06a0aa9-9919-4e0f-92a0-c67b6799a732 Red Hat Fedora Linux 10 Install CD
9b283809-2990-4f3b-a4e9-8b59a417536c Red Hat Fedora Linux 10 Live CD
b3df1320-5f11-4ebd-bd8c-2eef0e2ffe0d Red Hat Fedora Linux 11 Install CD
bf3cf10d-d07b-47de-b79c-327983182ef0 Red Hat Fedora Linux 11 Live CD
d10281f4-3bf1-4a98-bc0c-6dcec04fd995 Red Hat Fedora Linux 12 Install CD
c0ae458c-d5fb-4d9c-ae3c-778c12fe0649 Red Hat Fedora Linux 12 Live CD
d2511065-1d4f-46e5-936a-c6b5c32a7556 Red Hat Fedora Linux 13 Install CD
853bb98a-4fff-4c2f-a265-97c363f19ea5 Red Hat Fedora Linux 13 Live CD
5d63810b-6e11-4a26-a820-9e0e92c2f35c Ubuntu Linux 8.04.2 LTS Server Install CD
b06b793a-2aa6-433b-80b2-1863eacd3391 Ubuntu Linux 8.10 Server Install CD
95a324fd-3e45-498d-812f-98778bd127b9 Ubuntu Linux 9.04 Server Install CD
c90a801d-679e-4647-81ac-3146da724c62 Ubuntu Linux 9.10 Server Install CD
37e0f871-8a71-4b15-9478-ada0109dcce5 Ubuntu Linux 10.04 Server Install CD
f89af28e-ff00-4fc9-a7ed-22e7fa5a88db Windows Server 2008 Trial Install CD
7aead6d3-c3e6-4940-85c7-f5ee61f6ef2b Windows Web Server 2008 Trial Install CD

Server API

Server configuration

Key Value
name Server name.
parent UUID of parent object, if any.
cpu cpu quota in core MHz.
smp number of virtual processors or 'auto' to calculate based on cpu.
mem virtual memory size in MB.
ide:BUS[0-1]:UNIT[0-1]
scsi:BUS[0]:UNIT[0-7]
block:INDEX[0-7]
Drive UUID to connect as specified device.
ide:BUS[0-1]:UNIT[0-1]:media
scsi:BUS[0]:UNIT[0-7]:media
block:INDEX[0-7]:media
Media type - set to 'cdrom' to simulate a cdrom, set to 'disk' or leave unset to simulate a hard disk.
boot Device to boot, e.g. ide:0:0 or ide:1:0. Set to a list to make multiple devices bootable.
nic:0:model Create network interface with given type (use 'e1000' as default value; 'rtl8139' or 'virtio' are also available).
nic:0:dhcp The IP address offered by DHCP to network interface 0. If unset, no address is offered. Set to 'auto' to allocate a temporary IP at boot.
nic:1:model Create network interface with given type (use 'e1000' as default value; 'rtl8139' or 'virtio' are also available).
nic:1:vlan The VLAN to which the network interface is attached.
nic:1:mac The MAC address of the network interface. If unset, a randomly generated address is used. If set, should be unique on the VLAN.
vnc:ip IP address for overlay VNC access on port 5900. Set to 'auto', to reuse nic:0:dhcp if available, or otherwise allocate a temporary IP at boot.
vnc:password Password for VNC access. If unset, VNC is disabled.
vnc:tls Set to 'on' to require VeNCrypt-style TLS auth in addition to the password. If this is unset, only unencrypted VNC is available.

Resource API (static IPs, VLANs, etc.)