# 2013-02-14 johnpfeiffer
import requests # http://docs.python-requests.org/en/latest/api/
"""
http://developer.nirvanix.com/sitefiles/1000/API.html#_TocRESTProtocol
Example Nirvanix API request format http://services.nirvanix.com/ws/{NameSpace}/MethodName.ashx?name=value&name2=value2
DOWNLOAD_TOKEN_EXPIRATION_IN_SECONDS = 1800;
"""
AUTHENTICATE_URL = '/ws/Authentication/Login.ashx'
LIST_URL = '/ws/IMFS/ListFolder.ashx?'
UPLOAD = "/Upload.ashx"
GET_UPLOAD_TOKEN = "/ws/IMFS/GetStorageNodeExtended.ashx"
GET_DOWNLOAD_TOKEN = "/ws/IMFS/GetOptimalUrls.ashx"
GET_METADATA = "/ws/Metadata/GetMetadata.ashx"
DELETE = "/ws/IMFS/DeleteFiles.ashx"
class NirvanixConnection:
server = ''
session_token = ''
response = None
response_dictionary = dict()
username = ''
password = ''
appname = ''
appkey = ''
def __init__( self , server , username , password , appname , appkey ):
self.server = server
self.username = username
self.password = password
self.appname = appname
self.appkey = appkey
def parse_response( self ):
status_code = self.response.status_code
print 'RESPONSE-HEADERS: %s \n' % ( self.response.headers )
if status_code == 200:
self.response_dictionary = self.response.json()
# https://services.smartcloudobjectstorage.com/ws/Authentication/Login.ashx?appKey=7ec360a4-be3c-8495a2932c6f&username=My-Lab&password=MyPassword&output=json
def authenticate( self):
payload = {'appKey' : self.appkey , 'username' : self.username , 'password' : self.password , 'output' : 'json'}
print 'SENDING PARAMETERS: %s \n' % payload
self.response = requests.post( self.server + AUTHENTICATE_URL , params = payload , verify = True )
if not self.response:
print 'ERROR: no response \n'
else:
self.parse_response()
if not self.response_dictionary:
print 'ERROR: no response \n'
else:
self.session_token = self.response_dictionary[ 'SessionToken' ]
print 'session token = %s \n' % ( self.session_token )
response = ''
response_dictionary = None
# /ws/IMFS/ListFolder.ashx?sessionToken=YOURSESSIONTOKEN&folderPath=DirTest/F8&pageNumber=1&pageSize=5&output=json
def list_folder( self , folder_path , page_number , page_size ):
# http://developer.nirvanix.com/sitefiles/1000/API.html#_TocListFolder
# sortCode = Name, CreatedDate, SizeBytes, FileType
# sortDescending = true
# showMetadata = true
# showTags = true
payload = {'sessionToken' : self.session_token , 'folderPath' : folder_path , 'pageNumber' : page_number , 'pageSize' : page_size , 'output' : 'json'}
self.response = requests.post( self.server + LIST_URL , params = payload , verify = True )
if not self.response:
print 'ERROR: no response \n'
else:
self.parse_response()
if not self.response_dictionary:
print 'ERROR: no response \n'
else:
print 'session token = %s \n' % ( self.response_dictionary )
# self.session_token = self.response_dictionary[ 'SessionToken' ]
# print 'session token = %s \n' % ( self.session_token )
response = ''
response_dictionary = None
# MAIN ###############
def main():
print "start..."
server = 'https://services.smartcloudobjectstorage.com:443' # 'https://services.nirvanix.com:443'
username = 'IBM-Lab'
password = 'myPassword'
appname = 'IBM'
appkey = 'be3c-41f0-8d87-8495a2932c6f'
nirvanix_connection = NirvanixConnection( server , username , password , appname , appkey )
nirvanix_connection.authenticate()
folder_path = '/'
page_number = '1' # must be between 0 and 4000000
page_size = '500'
nirvanix_connection.list_folder( folder_path , page_number , page_size )
if __name__ == "__main__":
main()
"""
Nirvanix REST parameters for GetStorageNodeExtended (returns one token per upload, the token returned will expire after 72 hours)
https ://{apiHostName}/ws/IMFS/GetStorageNodeExtended.ashx?sessionToken={sessionToken}&destFolderPath={destFolderPath}&sizeBytes={ sizeBytes }&fileOverwrite=true&output=json
https://{uploadHost}/Upload.ashx?uploadToken={uploadToken}&destFolderPath={destFolderPath}&metadata={metadata} REQUIRED: uploadToken
REQUIRED: destFolderPath - The destination path of the files being uploaded.
REQUIRED: metadata - The metadata to be associated with the uploaded file.
"""