Superna eyeglass API Guide

Superna Eyeglass API guide

Contents

  1. 1 Product Name - i.e. Superna Eyeglass
    1. 1.1 Revision Changes to this Document
  2. 2 Superna Eyeglass REST API
    1. 2.1 How to Get Help
    2. 2.2 This document is designed as a guide for Superna Eyeglass API, should you have any issues that are not addressed in this guide, Superna offers support in several forms; on line, voicemail, Email, or live online chat.
  3. 3 Overview
  4. 4 API Documentation
  5. 5 Architecture
  6. 6 Use Cases
  7. 7 How to video Overview of Eyeglass API
  8. 8 How to Configure API Tokens
    1. 8.1 Creating Tokens
    2. 8.2 Deleting Tokens
    3. 8.3 Launch API Explorer
    4. 8.4 Token Authentication
      1. 8.4.1 Usage
    5. 8.5 Methods
    6. 8.6 Table of Contents
      1. 8.6.1 Consumes
      2. 8.6.2 Query parameters
      3. 8.6.3 Return type
      4. 8.6.4 Produces
      5. 8.6.5 Responses
      6. 8.6.6 Consumes
      7. 8.6.7 Query parameters
      8. 8.6.8 Return type
      9. 8.6.9 Produces
      10. 8.6.10 Responses
      11. 8.6.11 Path parameters
      12. 8.6.12 Consumes
      13. 8.6.13 Return type
      14. 8.6.14 Produces
      15. 8.6.15 Responses
      16. 8.6.16 Path parameters
      17. 8.6.17 Consumes
      18. 8.6.18 Return type
      19. 8.6.19 Produces
      20. 8.6.20 Responses
      21. 8.6.21 Consumes
      22. 8.6.22 Return type
      23. 8.6.23 Produces
      24. 8.6.24 Responses
      25. 8.6.25 Path parameters
      26. 8.6.26 Consumes
      27. 8.6.27 Return type
      28. 8.6.28 Produces
      29. 8.6.29 Responses
      30. 8.6.30 Path parameters
      31. 8.6.31 Consumes
      32. 8.6.32 Return type
      33. 8.6.33 Produces
      34. 8.6.34 Responses
      35. 8.6.35 Path parameters
      36. 8.6.36 Consumes
      37. 8.6.37 Return type
      38. 8.6.38 Produces
      39. 8.6.39 Responses
    7. 8.7 Models
    8. 8.8 Table of Contents
      1. 8.8.1 ErrorModelUp
      2. 8.8.2 JobUp
      3. 8.8.3 NodeUp
      4. 8.8.4 PolicyUp
      5. 8.8.5 ZoneUp
      6. 8.8.6 Inline_response_201Up
      7. 8.8.7 Job_failoverTargetUp
  9. 9 Examples
    1. 9.1 Example 1: CMDB Integration API
    2. 9.2 SyncIQ protection of shares and exports in the XML output Description
    3. 9.3 Quota output in the XML file Description
    4. 9.4 Asset Management output in the XML file Description
    5. 9.5 How to Integrate with a CMDB
    6. 9.6 Sample CMDB XML file for 4 clusters
    7. 9.7 Example 2: VMWare SRM Integrated Failover Example
    8. 9.8 Example 3: Initiate an Access Zone failover
      1. 9.8.1 Step 1: Get all of the Isilon Clusters provisioned in superna eyeglass:
      2. 9.8.2 Step 2: Using the ID from step 1, get all of the access zones on the cluster:
      3. 9.8.3 Step 3:  Initiate a failover
      4. 9.8.4 Step 4: Monitor the failover
    9. 9.9 Example 4: Get all currently running failover jobs
      1. 9.9.1 Step 1: use the ?state=running query to filter by running jobs:
    10. 9.10 Example 5: Get a historical record of all previous failover jobs
      1. 9.10.1 Step 1: use the ?state=finished query to filter by completed jobs:
  10. 10 Known Issues

Product Name - i.e. Superna Eyeglass

Revision Changes to this Document

Superna Eyeglass REST API

A collection of utilities for programmatic interaction with Superna Eyeglass

More information: http://support.superna.net

Contact Info: support@superna.net

Version: 1.0.0

Superna

http://support.superna.net

How to Get Help

This document is designed as a guide for Superna Eyeglass API, should you have any issues that are not addressed in this guide, Superna offers support in several forms; on line, voicemail, Email, or live online chat.

  1. The support site provides online ticket submission and case tracking.  Support Site link - support.superna.net 

  2. Leave a voicemail at 1 (855) 336-1580

In order to provide service you must have an account in our system. When calling in leave; customer name, email, description of question or issue, and primary contact for your company. We will  assign the case to primary contact for email followup.

  1. Email eyeglasssupport@superna.net

  2. To download license keys please go to the following  license keys.

  3. You can also raise a case right from in Eyeglass desktop using the help button, search for your issue and if want to raise a case or get a question answered, click the “leave us a message”  with your name, email and appliance ID and a case is opened directly from Eyeglass.

 http://site.superna.net/_/rsrc/1472870726155/support/LeaveUsAMessage.png?height=200&width=167

  1. Or get Support Using Chat M-F 9-5 EDT  (empty box?  we are not online yet)

  2. Eyeglass Live Chat 

  3. You should also review our support agreement here.

Overview

Customers  requiring  end to end integrated failover of compute layer and dependant storage used by customer or  external 3rd party applications like VMware SRM, can use Superna Eyeglass REST API to programmatically interact with Superna Eyeglass.

API Documentation

This information can be browsed with API Explorer using the url https://eyeglass ip/sera/docs/

Architecture

The API is REST based and Eyeglass provides an API explorer to explore the policies, nodes, jobs, needed to build failover scripts.

The API explorer has a CURL builder feature.  This feature allows users to browse the API select policies or access zones and clusters for  failover automation, and have the CURL command built dynamically for simple cut and paste into a script file to execute failover.

The API uses token generation to identify and authenticate an application using the the failover API.  This information is logged, to trace failover requests back to an authorized script or user in the failover logs.

Use Cases

  • Build dashboards that monitor the readiness  of policies, access zones or entire clusters. The API can be used in any development language that supports REST to build monitoring dashboards for end to end applications..

  • Request failover and monitor the success of the failover.

  • Build custom failover of one or more policy.

  • Integrate with post failover scripting solution that executes Eyeglass script engine post failover and call this logic with the same API for failover.  This enables application specific scripting to be initiated from the API and all execution runs on the Eyeglass appliance.

How to video Overview of Eyeglass API

Superna Eyeglass REST API for DR automation Walk Through

How to Configure API Tokens

Tokens are used for authentication of REST commands.  The name parameter is used to identify the application using the token. Example: Vmware SRM could have a token called “SRM”.   Revoking a token also disables an application's access to Eyeglass.

Reference this Screenshot


Screen Shot 2016-02-26 at 12.54.17 PM.png

Creating Tokens

  1. Open the Superna Eyeglass REST API icon on the main menu (Requires Enterprise license keys)

  2. Click on Create New Token button and enter a name to reference the token

Deleting Tokens

  1. Open the Superna Eyeglass REST API icon on the desktop (Requires Enterprise license keys)

  2. Click the Revoke Red X to remove the token and block access to Eyeglass

Launch API Explorer

  1. Click API Explorer tab and launch

  2. The interface requires an API key to live view configuration API information to build CURL APIScreen Shot 2016-02-26 at 12.59.37 PM.png

Watch this how to video to build a CURL command builder  to failover Video

Token Authentication

Use the token that was created with CURL or development languages to authentication the application to Eyeglass.  The API Explorer can be used to build curl command and shows syntax or how to contract an api call.

API Token Authentication in header

Include an http header named api_key with an authorized API token to authenticate to the Superna Eyeglass REST API.

Usage

The following curl command with the API token named igls-abc123 demonstrates authentication to the Superna Eyeglass REST API.

  • curl --header "api_key: igls-abc123" --header "accept: application/json" https://eyeglass.example/sera/v1/jobs

Methods

[ Jump to Models ]

Table of Contents

  1. GET /jobs

  2. POST /jobs

  3. GET /jobs/{id}

  4. DELETE /jobs/{id}

  5. GET /nodes

  6. GET /nodes/{id}

  7. GET /nodes/{id}/policies

  8. GET /nodes/{id}/zones

Up

GET /jobs

Get jobs (jobsGet)

Returns jobs from Superna Eyeglass.

Consumes

This API call consumes the following media types via the Content-Type request header:

  • application/json

Query parameters

state (optional)

Query Parameter — filter running or complete jobs [all, running, finished]

success (optional)

Query Parameter — filter jobs by result success [true, false]

Return type

array[Job]

Produces

This API call produces the following media types according to the Accept request header; the media type will be conveyed by the Content-Type response header.

  • application/json

Responses

200

jobs response

0

error payload

Up

POST /jobs

Create a new job (jobsPost)

Launch a new job in Eyeglass.

Consumes

This API call consumes the following media types via the Content-Type request header:

  • application/json

Query parameters

sourceid (required)

Query Parameter — ID of the source node for this job

targetid (required)

Query Parameter — ID of the target node for this job

failovertarget (required)

Query Parameter — ID of the access zone OR syncIQ policy to fail over.

Return type

inline_response_201

Produces

This API call produces the following media types according to the Accept request header; the media type will be conveyed by the Content-Type response header.

  • application/json

Responses

201

create job response

0

error payload

Up

GET /jobs/{id}

Retreive a job by ID (jobsIdGet)

Retrieve a job by id

Path parameters

id (required)

Path Parameter — ID of the job to retrieve

Consumes

This API call consumes the following media types via the Content-Type request header:

  • application/json

Return type

Job

Produces

This API call produces the following media types according to the Accept request header; the media type will be conveyed by the Content-Type response header.

  • application/json

Responses

200

jobs response

0

error payload

Up

DELETE /jobs/{id}

cancels a running job (jobsIdDelete)

Cancels a running job

Path parameters

id (required)

Path Parameter — ID of the running job to cancel

Consumes

This API call consumes the following media types via the Content-Type request header:

  • application/json

Return type

Job

Produces

This API call produces the following media types according to the Accept request header; the media type will be conveyed by the Content-Type response header.

  • application/json

Responses

200

jobs response

0

error payload

Up

GET /nodes

Get all nodes (nodesGet)

Returns all Superna Eyeglass Managed Devices.

Consumes

This API call consumes the following media types via the Content-Type request header:

  • application/json

Return type

array[Node]

Produces

This API call produces the following media types according to the Accept request header; the media type will be conveyed by the Content-Type response header.

  • application/json

Responses

200

nodes response

0

error payload

Up

GET /nodes/{id}

Find nodes by ID (nodesIdGet)

Returns the Superna Eyeglass Managed Devices based on ID

Path parameters

id (required)

Path Parameter — ID of the node to retrieve

Consumes

This API call consumes the following media types via the Content-Type request header:

  • application/json

Return type

Node

Produces

This API call produces the following media types according to the Accept request header; the media type will be conveyed by the Content-Type response header.

  • application/json

Responses

200

nodes response

0

error payload

Up

GET /nodes/{id}/policies

Find policies for a node (nodesIdPoliciesGet)

Returns the syncIQ policies for this node

Path parameters

id (required)

Path Parameter — ID of the node to retrieve

Consumes

This API call consumes the following media types via the Content-Type request header:

  • application/json

Return type

array[Policy]

Produces

This API call produces the following media types according to the Accept request header; the media type will be conveyed by the Content-Type response header.

  • application/json

Responses

200

policies response

0

error payload

Up

GET /nodes/{id}/zones

Find zones for a node (nodesIdZonesGet)

Returns the access zones for this node

Path parameters

id (required)

Path Parameter — ID of the node to retrieve

Consumes

This API call consumes the following media types via the Content-Type request header:

  • application/json

Return type

array[Zone]

Produces

This API call produces the following media types according to the Accept request header; the media type will be conveyed by the Content-Type response header.

  • application/json

Responses

200

zones response

0

error payload

Up

Models

[ Jump to Methods ]

Table of Contents

  1. ErrorModel

  2. Job

  3. Node

  4. Policy

  5. Zone

  6. Inline_response_201

  7. Job_failoverTarget

ErrorModelUp

code

Integer

message

String

JobUp

failoverTarget

Job_failoverTarget

finished

Long The end time of the job

id

String

jobType

String The type of the job

Enum:

zone_failover

policy_failover

name

String Human readable name for this job

sourceNode

Node The source node for this job.

started

Long The start time of the job

success

Boolean True if there were no errors

targetNode

Node The target node for this job

NodeUp

id

String

ip

String primary IP address of the node

name

String Unique name of the node

PolicyUp

failoverReadiness

String Enumeration describing the failover readiness of the policy.

Enum:

ok

warning

error

id

String

name

String SyncIQ Policy Name

target

Node Node that is the target for this syncIQ policy

zone

Zone Access zone for this policy

ZoneUp

failoverReadiness

String Enumeration describing the failover readiness of the zone.

Enum:

ok

warning

error

id

String

name

String Access Zone Name

Inline_response_201Up

id

String

Job_failoverTargetUp

zone

Zone The access zone being failed over.

policies

array[Policy] The policies being failed over

Examples

Example 1: CMDB Integration API

CMDB Integration with ServiceNow or other CMDB systems that can use “http get” and “XML input files”.

CMDB integration requires key data about the cluster and configuration to be maintained in the CMDB to map services, service status or service resources.  This is done for asset management, fault monitoring or common service availability with links between IT components that build a service.  For example home directories requires Isilon storage and Active directory.

The Eyeglass solution solves asset management and service status integration for shares and exports.

Supports CI objects (cluster, nodes, shares, exports, quotas)

  • CI attributes

  • cluster health, name, version,  type, revision

  • node disk usage

  • share name, path, access zone, DR status (Active, DR, unprotected)

  • export path, access zone, DR status (Active, DR, unprotected)

  • quota path, type, usage, (hard, soft, advisory) limits


To access the file type https://x.x.x.x/servicenow/servicenow.xml  to see the file.

This file is updated every 5 minutes with the latest information from all managed clusters.  The XML file contains all of the information outlined above with any newly detected configuration added to the file.


SyncIQ protection of shares and exports in the XML output Description

The service component of shares and exports works as follows with data protection status indicated in the object

  1. Assumption is anything with a share or export needs to be audited for SyncIQ data protection

  2. Eyeglass discovers all shares and exports and sets attribute of the share in XML to a state.

    1. unprotected - no SyncIQ policy

    2. Active (means writeable copy of the data as of now)

    3. backup (means DR copy not writeable)

Quota output in the XML file Description

Quotas are also output to the XML file with type, path and usage in bytes.  The useage is updated every 5 minutes to the file to keep the CMDB updated with quota usage information.

Asset Management output in the XML file Description

The cluster node count serial number output can be used for asset management updates.  This information is dynamically updated, if cluster nodes are added the file will include the new nodes.  If the software is updated on the cluster, the new version of the software will be included in this file.

This information can be used to maintain CMDB asset records for Isilon clusters that is current and up to date.

How to Integrate with a CMDB

The file path is tested with ServiceNow that has the http get/XML file feature. This is available in most CMDB products and integration and transformation maps are outside the scope of support of Eyeglass.  Professional Services can be purchased for assistance to integrate with a CMDB.  Integration typically requires getting the input file on a schedule and mapping the XML fields to a CI object.

This screenshot shows how integration can be done with ServiceNow.

Screen Shot 2017-01-27 at 1.28.36 PM.png

Sample CMDB XML file for 4 clusters

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<elements>

   <element>

       <cluster>

           <name>Cluster-1-7201</name>

           <guid>005056ba34580f410c55fd077989478a3821</guid>

           <local_serial>V5052427352</local_serial>

           <onefs_version>

               <build>B_7_2_1_014(RELEASE)</build>

               <release>v7.2.1.0</release>

               <type>Isilon OneFS</type>

               <version>Isilon OneFS v7.2.1.0 B_7_2_1_014(RELEASE): 0x70201500000000E:Mon Jun 22 20:05:42 GMT 2015    root@sea-build7-03:/b/mnt/obj/b/mnt/src/sys/IQ.amd64.release   clang version 3.3 (tags/RELEASE_33/final)</version>

               <revision>504967551327928334</revision>

           </onefs_version>

       </cluster>

       <nodes>

           <node>

               <health>OK</health>

               <serial_number>V5052427352</serial_number>

               <HDD_size>35GB</HDD_size>

               <HDD_used>13GB</HDD_used>

               <HDD_avail>23GB</HDD_avail>

               <VHS>n/a</VHS>

           </node>

       </nodes>

       <shares>

           <share>

               <name>SMB2</name>

               <path>/ifs/data/policy1</path>

               <zone>System</zone>

               <status>ACTIVE</status>

           </share>

           <share>

               <name>spacetest</name>

               <path>/ifs/data/policy1/space</path>

               <zone>System</zone>

               <status>ACTIVE</status>

           </share>

           <share>

               <name>igls-dfs-dfs1</name>

               <path>/ifs/data/userdata/dfs1</path>

               <zone>data</zone>

               <status>BACKUP</status>

           </share>

           <share>

               <name>igls-dfs-roam</name>

               <path>/ifs/data/userdata/dfs1/roam</path>

               <zone>data</zone>

               <status>BACKUP</status>

           </share>

           <share>

               <name>share1</name>

               <path>/ifs/data/userdata/share1</path>

               <zone>data</zone>

               <status>ACTIVE</status>

           </share>

       </shares>

       <exports>

           <export>

               <paths>/ifs</paths>

               <zone>System</zone>

               <status>UNPROTECTED</status>

           </export>

           <export>

               <paths>/ifs/data/robot</paths>

               <zone>EyeglassRunbookRobot-AccessZone</zone>

               <status>ACTIVE</status>

           </export>

           <export>

               <paths>/ifs/data/userdata/export1/andrew</paths>

               <zone>data</zone>

               <status>ACTIVE</status>

           </export>

           <export>

               <paths>/ifs/data/userdata/export1</paths>

               <zone>data</zone>

               <status>ACTIVE</status>

           </export>

       </exports>

       <aliases/>

       <quotas>

           <quota>

               <path>/ifs/data/userdata</path>

               <type>directory</type>

               <used>5299221577</used>

               <hardLimit>17008070491</hardLimit>

           </quota>

           <quota>

               <path>/ifs/data/userdata/export1/andrew</path>

               <type>directory</type>

               <used>12</used>

           </quota>

           <quota>

               <path>/ifs/data/policy1</path>

               <type>directory</type>

               <used>1972155571</used>

               <hardLimit>21474836480</hardLimit>

           </quota>

           <quota>

               <path>/ifs/data/policy1/space</path>

               <type>directory</type>

               <used>851444622</used>

           </quota>

           <quota>

               <path>/ifs/data/userdata/export1</path>

               <type>directory</type>

               <used>124216376</used>

               <advisoryLimit>1048576000</advisoryLimit>

           </quota>

           <quota>

               <path>/ifs/data/userdata/share1</path>

               <type>directory</type>

               <used>218</used>

           </quota>

           <quota>

               <path>/ifs/data/policy1/departmentB</path>

               <type>directory</type>

               <used>12</used>

               <hardLimit>26843545600</hardLimit>

           </quota>

           <quota>

               <path>/ifs/data/robot</path>

               <type>directory</type>

               <used>24833</used>

           </quota>

           <quota>

               <path>/ifs/data/policy1/departmentA</path>

               <type>directory</type>

               <used>12</used>

               <hardLimit>26843545600</hardLimit>

           </quota>

       </quotas>

   </element>

   <element>

       <cluster>

           <name>Cluster2-7201</name>

           <guid>005056ba72edf6450c552312a728d3a22a23</guid>

           <local_serial>V5052443373</local_serial>

           <onefs_version>

               <build>B_7_2_1_014(RELEASE)</build>

               <release>v7.2.1.0</release>

               <type>Isilon OneFS</type>

               <version>Isilon OneFS v7.2.1.0 B_7_2_1_014(RELEASE): 0x70201500000000E:Mon Jun 22 20:05:42 GMT 2015    root@sea-build7-03:/b/mnt/obj/b/mnt/src/sys/IQ.amd64.release   clang version 3.3 (tags/RELEASE_33/final)</version>

               <revision>504967551327928334</revision>

           </onefs_version>

       </cluster>

       <nodes>

           <node>

               <health>-A--</health>

               <serial_number>V5052443373</serial_number>

               <HDD_size>35GB</HDD_size>

               <HDD_used>11GB</HDD_used>

               <HDD_avail>25GB</HDD_avail>

               <VHS>n/a</VHS>

           </node>

       </nodes>

       <shares>

           <share>

               <name>igls-dfs-SMB2</name>

               <path>/ifs/data/policy1</path>

               <zone>System</zone>

               <status>BACKUP</status>

           </share>

           <share>

               <name>igls-dfs-spacetest</name>

               <path>/ifs/data/policy1/space</path>

               <zone>System</zone>

               <status>BACKUP</status>

           </share>

           <share>

               <name>migrate1</name>

               <path>/ifs/data/migrate1</path>

               <zone>System</zone>

               <status>UNPROTECTED</status>

           </share>

           <share>

               <name>dfs1</name>

               <path>/ifs/data/userdata/dfs1</path>

               <zone>data</zone>

               <status>ACTIVE</status>

           </share>

           <share>

               <name>roam</name>

               <path>/ifs/data/userdata/dfs1/roam</path>

               <zone>data</zone>

               <status>ACTIVE</status>

           </share>

           <share>

               <name>share1</name>

               <path>/ifs/data/userdata/share1</path>

               <zone>data</zone>

               <status>BACKUP</status>

           </share>

           <share>

               <name>share2</name>

               <path>/ifs/data/userdata/share2</path>

               <zone>data</zone>

               <status>ACTIVE</status>

           </share>

           <share>

               <name>dfs1</name>

               <path>/ifs/data/dr-testing/dfs1</path>

               <zone>DR-Testing-Zone</zone>

               <status>BACKUP</status>

           </share>

           <share>

               <name>share1</name>

               <path>/ifs/data/dr-testing/share1</path>

               <zone>DR-Testing-Zone</zone>

               <status>BACKUP</status>

           </share>

           <share>

               <name>share2</name>

               <path>/ifs/data/dr-testing/share2</path>

               <zone>DR-Testing-Zone</zone>

               <status>BACKUP</status>

           </share>

       </shares>

       <exports>

           <export>

               <paths>/ifs</paths>

               <zone>System</zone>

               <status>UNPROTECTED</status>

           </export>

           <export>

               <paths>/ifs/data/migrate1</paths>

               <zone>System</zone>

               <status>UNPROTECTED</status>

           </export>

           <export>

               <paths>/ifs/data/robot</paths>

               <zone>EyeglassRunbookRobot-AccessZone</zone>

               <status>BACKUP</status>

           </export>

           <export>

               <paths>/ifs/data/userdata/export1/andrew</paths>

               <zone>data</zone>

               <status>BACKUP</status>

           </export>

           <export>

               <paths>/ifs/data/userdata/export1</paths>

               <zone>data</zone>

               <status>BACKUP</status>

           </export>

           <export>

               <paths>/ifs/data/dr-testing/export1/andrew</paths>

               <zone>DR-Testing-Zone</zone>

               <status>BACKUP</status>

           </export>

           <export>

               <paths>/ifs/data/dr-testing/export1</paths>

               <zone>DR-Testing-Zone</zone>

               <status>BACKUP</status>

           </export>

       </exports>

       <aliases/>

       <quotas>

           <quota>

               <path>/ifs/data/userdata/dfs1</path>

               <type>directory</type>

               <used>5175108664</used>

           </quota>

           <quota>

               <path>/ifs/data/userdata/dfs1/roam</path>

               <type>directory</type>

               <used>2251508</used>

           </quota>

           <quota>

               <path>/ifs/data/migrate1</path>

               <type>directory</type>

               <used>769442173</used>

           </quota>

           <quota>

               <path>/ifs/data/userdata/share2</path>

               <type>directory</type>

               <used>12</used>

           </quota>

       </quotas>

   </element>

   <element>

       <cluster>

           <name>prod-8</name>

           <guid>005056ba67371492dd56f106ca5e3ff16028</guid>

           <local_serial>SV200-004EIJ-B96U</local_serial>

           <onefs_version>

               <build>B_8_0_1_007(RELEASE)</build>

               <release>v8.0.1.0</release>

               <type>Isilon OneFS</type>

               <version>Isilon OneFS v8.0.1.0 B_8_0_1_007(RELEASE): 0x800015000000007:Thu Sep  8 06:34:05 PDT 2016    root@sea-build10-02:/b/mnt/obj/b/mnt/src/sys/IQ.amd64.release   FreeBSD clang version 3.3 (tags/RELEASE_33/final 183502) 20130610</version>

               <revision>576462195412434951</revision>

           </onefs_version>

       </cluster>

       <nodes>

           <node>

               <health>OK</health>

               <serial_number>SV200-004EIJ-B96U</serial_number>

               <HDD_size>18.1GB</HDD_size>

               <HDD_used>2.6GB</HDD_used>

               <HDD_avail>15.5GB</HDD_avail>

               <VHS>n/a</VHS>

           </node>

       </nodes>

       <shares>

           <share>

               <name>migrate2</name>

               <path>/ifs/data/migrate2</path>

               <zone>System</zone>

               <status>UNPROTECTED</status>

           </share>

           <share>

               <name>dfs1</name>

               <path>/ifs/data/marketing/dfs1</path>

               <zone>marketing</zone>

               <status>ACTIVE</status>

           </share>

           <share>

               <name>share1</name>

               <path>/ifs/data/marketing/shares</path>

               <zone>marketing</zone>

               <status>ACTIVE</status>

           </share>

       </shares>

       <exports>

           <export>

               <paths>/ifs</paths>

               <zone>System</zone>

               <status>UNPROTECTED</status>

           </export>

           <export>

               <paths>/ifs/data/migrate2</paths>

               <zone>System</zone>

               <status>UNPROTECTED</status>

           </export>

           <export>

               <paths>/ifs/data/marketing/nfs/export1</paths>

               <zone>marketing</zone>

               <status>ACTIVE</status>

           </export>

       </exports>

       <aliases/>

       <quotas>

           <quota>

               <path>/ifs/data/marketing/nfs/export1</path>

               <type>directory</type>

               <used>0</used>

           </quota>

           <quota>

               <path>/ifs/data/marketing/shares</path>

               <type>directory</type>

               <used>12</used>

           </quota>

           <quota>

               <path>/ifs/data/marketing/dfs1</path>

               <type>directory</type>

               <used>58599</used>

           </quota>

           <quota>

               <path>/ifs/data/migrate2</path>

               <type>directory</type>

               <used>769417411</used>

           </quota>

       </quotas>

   </element>

   <element>

       <cluster>

           <name>dr-8</name>

           <guid>005056ba657091badd564b1487f19066d641</guid>

           <local_serial>SV200-004EIJ-AQR3</local_serial>

           <onefs_version>

               <build>B_8_0_1_007(RELEASE)</build>

               <release>v8.0.1.0</release>

               <type>Isilon OneFS</type>

               <version>Isilon OneFS v8.0.1.0 B_8_0_1_007(RELEASE): 0x800015000000007:Thu Sep  8 06:34:05 PDT 2016    root@sea-build10-02:/b/mnt/obj/b/mnt/src/sys/IQ.amd64.release   FreeBSD clang version 3.3 (tags/RELEASE_33/final 183502) 20130610</version>

               <revision>576462195412434951</revision>

           </onefs_version>

       </cluster>

       <nodes>

           <node>

               <health>OK</health>

               <serial_number>SV200-004EIJ-AQR3</serial_number>

               <HDD_size>18.1GB</HDD_size>

               <HDD_used>2.9GB</HDD_used>

               <HDD_avail>15.2GB</HDD_avail>

               <VHS>n/a</VHS>

           </node>

       </nodes>

       <shares>

           <share>

               <name>migrate1</name>

               <path>/ifs/data/dr/migrate</path>

               <zone>System</zone>

               <status>UNPROTECTED</status>

           </share>

           <share>

               <name>igls-dfs-dfs1</name>

               <path>/ifs/data/marketing/dfs1</path>

               <zone>marketing</zone>

               <status>BACKUP</status>

           </share>

           <share>

               <name>share1</name>

               <path>/ifs/data/marketing/shares</path>

               <zone>marketing</zone>

               <status>BACKUP</status>

           </share>

       </shares>

       <exports>

           <export>

               <paths>/ifs</paths>

               <zone>System</zone>

               <status>UNPROTECTED</status>

           </export>

           <export>

               <paths>/ifs/data/dr/migrate</paths>

               <zone>System</zone>

               <status>UNPROTECTED</status>

           </export>

           <export>

               <paths>/ifs/data/marketing/nfs/export1</paths>

               <zone>marketing</zone>

               <status>BACKUP</status>

           </export>

       </exports>

       <aliases/>

       <quotas>

           <quota>

               <path>/ifs/data/dr/migrate</path>

               <type>directory</type>

               <used>167747631</used>

           </quota>

       </quotas>

   </element>

</elements>



Example 2: VMWare SRM Integrated Failover Example


vmware SRM API integration.png

  1. VMWare SRM starts site failover of VM’s

  2. External API calls Eyeglass REST API using curl command (created with CURL builder Eyeglass API explorer interface).  VMWare SRM Creating Custom Recovery Steps  

    1. Add command to the recovery plan: http://pubs.vmware.com/srm-61/index.jsp#com.vmware.srm.admin.doc/GUID-BABE0457-EB6F-4650-BB8B-01300ACAFF2F.html

    2. Create Message Prompts or Command Steps for Individual Virtual Machines: (http://pubs.vmware.com/srm-61/index.jsp#com.vmware.srm.admin.doc/GUID-45EE6522-3659-437F-B5AF-E9510AAA2CC8.html)

    3. On the Recovery Properties tab, click Pre-Power On Steps.

      1. Command on SRM Server  Runs a command on Site Recovery Manager Server. This option is available for both pre-power on steps and post-power on steps

      2. Complete rest of Step configuration

    4. You must start the Windows command shell using its full path on the local host. For example, to run a script located in c:\alarmscript.bat, use the following command line:

c:\windows\system32\cmd.exe /c c:\alarmscript.bat

    1. You must install batch files and commands on the Site Recovery Manager Server at the recovery site.

    2. Batch files or commands  producing output that contains characters with ASCII values greater than 127 must use UTF-8 encoding. Site Recovery Manager records only the final 4KB of script output in log files and in the recovery history. Scripts that produce more output should redirect the output to a file rather than sending it to the standard output to be logged.

Note: Batch files and commands must finish within 600 seconds, otherwise, the recovery plan terminates with an error. (See the following VMWare reference Change Recovery Settings). Therefore, during the configuration of SRM you may receive a timeout after 600 seconds . You can increase or decrease this value by editing the SRM configuration file (vmware-dr.xml). Look for the following section:

<calloutCommandLineTimeout>600</calloutCommandLineTimeout>

    1. Change value to the appropriate value.

  1. Eyeglass API processes request from CURL command with timeout set and starts any failover mode supported by Eyeglass and requested by the CURL builder setup for the failover.





Example 3: Initiate an Access Zone failover

Step 1: Get all of the Isilon Clusters provisioned in superna eyeglass:


Request:

curl -k -H "api_key: igls-4e81gu94mc3opgf7uuhdtrf6oo0a0arfcuajra65l834l8p53j" https://192.168.10.10/sera/v1/nodes


Response:

[

{

  "id": "Kyle-8-A_00505698937a1b73bb5698242b10b5fe9a97",

  "ip": "172.16.86.238",

  "name": "Kyle-8-A"

},

{

  "id": "Kyle-8-B_00505698f0793f8bbb56fc176e2f7b6e204c",

  "ip": "172.16.86.248",

  "name": "Kyle-8-B"

}

]

Step 2: Using the ID from step 1, get all of the access zones on the cluster:


Request:

curl -k -H "api_key: igls-p9cbjc3bjkgbo3ceph9t29jholrtvuc08p17ri7na73eal5g9nv" http://localhost:8089/sera/v1/nodes/Kyle-8-A_00505698937a1b73bb5698242b10b5fe9a97/zones


Response:

[

{

  "failoverReadiness": "warning",

  "id": "zone-Kyle-8-A_kylezone",

  "name": "kylezone"

}

]



Step 3:  Initiate a failover

Using the id of the zone and the IDs of the source and target clusters, post a new job to the jobs route to initiate a failover:


Request

curl -X POST -k -H "api_key: igls-p9cbjc3bjkgbo3ceph9t29jholrtvuc08p17ri7na73eal5g9nv" -H "Content-type: application/json" "http://localhost:8089/sera/v1/jobs?sourceid=Kyle-8-A_00505698937a1b73bb5698242b10b5fe9a97&targetid=Kyle-8-B_00505698f0793f8bbb56fc176e2f7b6e204c&failovertarget=zone-Kyle-8-A_kylezone"


Response

{

"id": "job-1457385733807-630400755"

}


Step 4: Monitor the failover

Using the ID of the job, monitor the status of the failover.  When the job is complete, there will be a “finished” property in the output and a “success” property indicating whether the job was a success or a failover.


Request

curl -k -H "api_key: igls-p9cbjc3bjkgbo3ceph9t29jholrtvuc08p17ri7na73eal5g9nv" http://localhost:8089/sera/v1/jobs/job-1457385733807-630400755


Response

{

"failoverTarget": {

  "zone": {

    "failoverReadiness": "error",

    "id": "zone-Kyle-8-A_kylezone",

    "name": "kylezone"

  }

},

"finished": 1457385819964,

"id": "job-1457385733807-630400755",

"jobType": "zone_failover",

"name": "Access_Zone_Failover__Kyle-8-A__2016-03-07_16-22-13",

"sourceNode": {

  "id": "Kyle-8-A_00505698937a1b73bb5698242b10b5fe9a97",

  "ip": "172.16.86.238",

  "name": "Kyle-8-A"

},

"started": 1457385733813,

"success": true,

"targetNode": {

  "id": "Kyle-8-B_00505698f0793f8bbb56fc176e2f7b6e204c",

  "ip": "172.16.86.248",

  "name": "Kyle-8-B"

}

}





Example 4: Get all currently running failover jobs

Step 1: use the ?state=running query to filter by running jobs:

Output from this route will not have “success” or “finished” parameters in the payload.


Request:

curl -k -H "api_key: igls-p9cbjc3bjkgbo3ceph9t29jholrtvuc08p17ri7na73eal5g9nv" http://localhost:8089/sera/v1/jobs\?state\=running


Response:

{

"failoverTarget": {

  "zone": {

    "failoverReadiness": "warning",

    "id": "zone-Kyle-8-A_kylezone",

    "name": "kylezone"

  }

},

"id": "job-1457385733807-630400755",

"jobType": "zone_failover",

"name": "Access_Zone_Failover__Kyle-8-A__2016-03-07_16-22-13",

"sourceNode": {

  "id": "Kyle-8-A_00505698937a1b73bb5698242b10b5fe9a97",

  "ip": "172.16.86.238",

  "name": "Kyle-8-A"

},

"started": 1457385733813,

"targetNode": {

  "id": "Kyle-8-B_00505698f0793f8bbb56fc176e2f7b6e204c",

  "ip": "172.16.86.248",

  "name": "Kyle-8-B"

}

}


Example 5: Get a historical record of all previous failover jobs

Step 1: use the ?state=finished query to filter by completed jobs:

Output from this route will not have “success” or “finished” parameters in the payload.


Request:

curl -k -H "api_key: igls-p9cbjc3bjkgbo3ceph9t29jholrtvuc08p17ri7na73eal5g9nv" http://localhost:8089/sera/v1/jobs?state=finished


Response:

{

"failoverTarget": {

  "zone": {

    "failoverReadiness": "warning",

    "id": "zone-Kyle-8-A_kylezone",

    "name": "kylezone"

  }

},

"id": "job-1457385733807-630400755",

"finished": 1457385819964,

"jobType": "zone_failover",

"name": "Access_Zone_Failover__Kyle-8-A__2016-03-07_16-22-13",

"sourceNode": {

  "id": "Kyle-8-A_00505698937a1b73bb5698242b10b5fe9a97",

  "ip": "172.16.86.238",

  "name": "Kyle-8-A"

},

"started": 1457385733813,

"success": true,

"targetNode": {

  "id": "Kyle-8-B_00505698f0793f8bbb56fc176e2f7b6e204c",

  "ip": "172.16.86.248",

  "name": "Kyle-8-B"

}

}


Known Issues


T780 REST API Get /jobs does not show policy info for DFS job

Description: A DFS failover type has an empty failoverTarget field in the response

Workaround: Use the Superna Eyeglass UI to see the failover target

———————————-


T781 REST API Get jobs does not list RunBook robot failover jobs

Description: Failovers initiated by the runbook robot are not visible in the running jobs or this history

Workaround: Use the superna eyeglass UI to see the history including runbook robot jobs.

———————————-

T783 Rest API delete job error

Description: Deleting a job from the API Explorer requires an empty JSON object to be specified in the body.

Workaround: Enter ‘{}’ (without quotes) into the body field of the DELETE /jobs section of the API explorer to cancel a job.

———————————-


T784 REST API get /nodes/{id}/policies shows 'warning' for disabled policy

Description: A disabled policy has a warning status in the /nodes/{id}/policies route.

Workaround: If a policy has a “warning” status, validate it in the Superna Eyeglass UI before failing over.

—————————————–

T785 REST API Get /nodes/{id}/policies shows same zone info for all policies

Description: The zone information in the /nodes/{id}/policies route displays the wrong zone information when multiple access zones are present on the isilon cluster.

Workaround: Use the superna eyeglass UI to determine the relationship between policies and access zones.

———————————-


T789 REST API does not run DFS failover

Description: If a policy is DFS enabled in eyeglass, submitting a new job through the Superna Eyeglass REST API will result in a SyncIQ policy failover, not a DFS policy failover.

Workaround: Use the Superna Eyeglass UI to launch failovers for DFS enabled jobs.