Space Walkthrough - Complete Code

The following is all the code snippets from Walkthrough: Creating a Space, collected and rearranged into a single script.

from __future__ import print_function

import requests
from time import sleep
from arcapix.config import config


def main():
    url = "https://localhost"


    # --- Get an auth Token ---

    authserver = config['arcapix.auth.server.url']  # typically https://localhost

    payload = {'grant_type': 'password', 'username': 'myuser', 'password': 'mypassword'}
    resp = requests.post(authserver + '/oauth2/token', data=payload)

    assert resp.status_code == 200

    token = resp.json()['access_token']


    # --- Set up a requests Session ---

    session = requests.Session()
    session.auth = (token, '')

    # if you get SSLErrors from the self-signed certificates, uncomment the following
    # session.verify = False


    # --- Check we have permission to create spaces ---

    resp = session.options(url + '/spaces/')

    assert 'POST' in resp.headers['Allow']


    # --- Find a profile for the filesystem 'mmfs1', pool 'sas1' ---

    params = {'where': '{"name": "mmfs1-sas1"}'}
    resp = session.get(url + '/profiles/', params=params)

    assert resp.headers['X-Total-Count'] == '1'  # note: string

    profile = resp.json()['collection']['items'][0]['href']


    # --- Find an exposer for the filesystem mmfs1 ---

    params = {'where': '{"type": "gpfsnative", "name": "mmfs1"}'}
    resp = session.get(url + '/exposers/', params=params)

    exposer = resp.json()['collection']['items'][0]['href']


    # --- Create a template from directory '/mmfs1/project_template' ---

    template_data = {
        "template": {
            "data": [
                {"name": "name", "value": "project_template"},
                {"name": "type", "value": "filesystemtemplate"},
                {"name": "template_location", "value": "/mmfs1/project_template"}
            ]
        }
    }

    resp = session.post(
        url + '/templates/',
        json=template_data,
        headers={"Content-Type": "application/vnd.collection+json"}
    )

    # wait for template to become ACTIVE
    checkurl = resp.headers['Location']
    wait_until_active(session, checkurl)

    resp = session.get(resp.headers['Location'])
    template = resp.json()['collection']['items'][0]['href']


    # --- Check template creation job logs ---

    href = get_link_href(resp.json(), 0, 'Jobs')
    resp = session.get(url + href)

    href = get_link_href(resp.json(), 0, "stderr")
    resp = session.get(url + href)

    print(resp.text)


    # --- Create the space ---

    space_data = {
        "template": {
            "data": [
                {"name": "name", "value": "sleepy-snake"},
                {"name": "relativepath", "value": "projects/sleepy_snake"},
                {"name": "exposers", "value": exposer},
                {"name": "profile", "value": profile},
                {"name": "templates", "value": template},
                {"name": "size", "value": 4 * 1024 * 1024 * 1024}  # 4GB
            ]
        }
    }

    resp = session.post(
        url + '/spaces/',
        json=space_data,
        headers={"Content-Type": "application/vnd.collection+json"}
    )

    # wait for the space to become ACTIVE
    checkurl = resp.headers['Location']
    wait_until_active(session, checkurl)

    # Get the ID of the newly created space
    params = {'where': '{"name": "sleep-snake"}'}

    resp = session.get(url + '/spaces/', params=params)
    print(resp.json())

    space = resp.json()['collection']['items'][0]['href']


    # --- Create a snapshot of the space ---

    snapshot_data = {
        "template": {
            "data": [
                {"name": "name", "value": "snake-snap"},
                {"name": "type", "value": "gpfsspacesnapshot"},
                {"name": "space", "value": space},
            ]
        }
    }

    resp = session.post(
        url + '/snapshots/',
        json=snapshot_data,
        headers={"Content-Type": "application/vnd.collection+json"}
    )

    # wait for the snapshot to become ACTIVE
    checkurl = resp.headers['Location']
    wait_until_active(session, checkurl)


# --- Helper Functions ---

def get_status(collection, item):
    for data in collection['collection']['items'][item]['data']:
        if data['name'] == 'status':
            return data['value']
    else:
        raise KeyError("Status field not found")


def get_link_href(collection, item, name):
    for link in collection['collection']['items'][item]['links']:
        if link['name'] == name:
            return link['href']
    else:
        raise KeyError(name)


def wait_until_active(session, checkurl, timeout=10):
    timeout = int(timeout)
    for _ in range(timeout):
        sleep(1)
        resp = session.get(checkurl)
        status = get_status(resp.json(), 0)
        if status == 'ACTIVE':
            break
    else:
        raise Exception(
            "Item didn't become active after %ss - got status '%s'"
            % (timeout, status)
        )

if __name__ == '__main__':
    main()