Month: January 2015

Tintri Receives InfoWorld’s 2015 Technology of the Year Award


Just a little horn tooting.  Tintri was 1 of 33 award winners in InfoWorld’s 2015 Technology of the Year.  Tintri, which is number 30, was awarded along with Dockets, HP Moonshot, Apache Storm, and the Go programming language.   Quoting the author Paul Ferrill, “This is not your father’s general purpose storage array.” sums it up.


– Rick –


Delete the Oldest Snapshot on a VMstore

Happy New Year,

For the beginning of the New Year, I have coded an REST API example in Python.  This example queries for the oldest user generated snapshot and removes it.  This example shows how to use a query string with the GET snapshot API invoke, and a DELETE snapshot.  What is cool about this example is that there are functions that encapsulate the requests Python modules calls that hopefully will be reusable.  I have attached the example, and will go through some of the code below.

First off, you will need these Python modules:

import requests
import json
import sys
from datetime import datetime

Let’s look at the login function.  A user name and password is all that is needed over HTTPS.

def api_login(server_name, user_name, password):
    # Payload, header and URL for login call
    headers = {'content-type': 'application/json'}
    payload = {'username': user_name,   # payload needed for post.
               'password': password,
               'typeId': ''}   # 'typeId' is required.
    url_login = 'https://'+ server_name + '/api/v310/session/login'

        # Invoke the login API.
        r =, data=json.dumps(payload),
        headers=headers, verify=False)
    except requests.ConnectionError:
        print_error("Login: API Connection error occurred")
    except requests.HTTPError:
        print_error("Login: HTTP error occurred")
    except requests.Timeout:
        print_error("Login: Request timed out")
        print_error("Login: An unexpected error " + sys.exc_info()[0] +
                    " occurred")

    # if HTTP Response is not 200 then raise an exception
    if r.status_code != 200:
        print_error("The HTTP response for login call to the server " +
                    server_name + " is not 200, but is: " + str(r.status_code))
        print_error("url = " + url_login)
        print_error("payload = " + str(payload))
        print_error("response: " + r.text)

    session_id = r.cookies['JSESSIONID']   # Session ID is return for subsequent invokes.
    return session_id

The info API does not require user name, password, or session ID.

r = api_get(server_name, '/api/info')
json_info = r.json()

The query below requests that the response returns the oldest user generated snapshot.

# Create filter to get the oldest user generated snapshot
q_filter = {'queryType': 'TOP_DOCS_BY_TIME',
'limit': '1', # There can only be one

# Get the oldest user generated snapshot
r = api_get_query(server_name, '/api/v310/snapshot', q_filter, session_id)

This example could be used for the basis of a snapshot delete program.  Additions could be added to the query string, like VM name or before this time.

The code example is here: delete_snapshot.


– Rick –