import pycurl import sys, getopt import zipfile from StringIO import StringIO import json import copy from importCommon import * import importCommon ######################################################################################################################################################################################### # # # Import all users from a given file # # # # activation : # # python importNormativeTypes.py [-s | --scheme= ] [-i | --ip=] [-p | --port= ] [-f | --ifile= ] # # [-v | --updateversion=] # # shortest activation (be host = localhost, be port = 8080): # # python importNormativeTypes.py [-f | --ifile= ] # # # ######################################################################################################################################################################################### def createNormativeType(scheme, beHost, bePort, adminUser, fileDir, ELEMENT_NAME, updateversion): try: log("in create normative type ", ELEMENT_NAME) debug("userId", adminUser) debug("fileDir", fileDir) buffer = StringIO() c = pycurl.Curl() url = scheme + '://' + beHost + ':' + bePort + '/sdc2/rest/v1/catalog/upload/multipart' if updateversion != None: url += '?createNewVersion=' + updateversion c.setopt(pycurl.URL, url) c.setopt(pycurl.POST, 1) adminHeader = 'USER_ID: ' + adminUser # c.setopt(pycurl.HTTPHEADER, ['Content-Type: application/json', 'Accept: application/json', adminHeader]) c.setopt(pycurl.HTTPHEADER, [adminHeader]) yml_path = fileDir + ELEMENT_NAME + "/" + ELEMENT_NAME + ".yml" path = fileDir + ELEMENT_NAME + "/" + ELEMENT_NAME + ".zip" zf = zipfile.ZipFile(path, "w") zf.write(yml_path, ELEMENT_NAME + '.yml') zf.close() debug(path) CURRENT_JSON_FILE = fileDir + ELEMENT_NAME + "/" + ELEMENT_NAME + ".json" # sed -i 's/"userId": ".*",/"userId": "'${USER_ID}'",/' ${CURRENT_JSON_FILE} jsonFile = open(CURRENT_JSON_FILE) debug("before load json") json_data = json.load(jsonFile, strict=False) debug(json_data) jsonAsStr = json.dumps(json_data) send = [('resourceMetadata', jsonAsStr), ('resourceZip', (pycurl.FORM_FILE, path))] debug(send) c.setopt(pycurl.HTTPPOST, send) # data = json.dumps(user) # c.setopt(c.POSTFIELDS, data) if scheme == 'https': # security "man in middle" vulnerability c.setopt(pycurl.SSL_VERIFYPEER, 0) c.setopt(pycurl.SSL_VERIFYHOST, 0) # c.setopt(c.WRITEFUNCTION, lambda x: None) c.setopt(pycurl.WRITEFUNCTION, buffer.write) # print("before perform") c.perform() # print("Before get response code") httpRes = c.getinfo(pycurl.RESPONSE_CODE) if (httpRes != None): debug("http response=", httpRes) # print('Status: ' + str(responseCode)) debug(buffer.getvalue()) c.close() return ELEMENT_NAME, httpRes, buffer.getvalue() except Exception as inst: print("ERROR=" + str(inst)) return ELEMENT_NAME, None, None def usage(): print sys.argv[0], \ '[optional -s | --scheme=, default http] [-i | ' \ '--ip=] [-p | --port= ] [-u | --user= ] ' \ '[-v | --updateversion=]' def importNormativeTypes(scheme, beHost, bePort, adminUser, fileDir, updateversion): normativeTypes = ["root", "compute", "softwareComponent", "webServer", "webApplication", "DBMS", "database", "objectStorage", "blockStorage", "containerRuntime", "containerApplication", "loadBalancer", "port", "network"] # normativeTypes = [ "root" ] responseCodes = [200, 201] if (updateversion == 'false'): responseCodes = [200, 201, 409] results = [] for normativeType in normativeTypes: result = createNormativeType(scheme, beHost, bePort, adminUser, fileDir, normativeType, updateversion) results.append(result) if (result[1] == None or result[1] not in responseCodes): print "Failed creating normative type " + normativeType + ". " + str(result[1]) return results def main(argv): print 'Number of arguments:', len(sys.argv), 'arguments.' beHost = 'localhost' bePort = '8080' adminUser = 'jh0003' updateversion = 'true' scheme = 'http' try: opts, args = getopt.getopt(argv, "i:p:u:v:h:s:", ["ip=", "port=", "user=", "updateversion=", "scheme="]) except getopt.GetoptError: usage() error_and_exit(2, 'Invalid input') for opt, arg in opts: # print opt, arg if opt == '-h': usage() sys.exit(3) elif opt in ("-i", "--ip"): beHost = arg elif opt in ("-p", "--port"): bePort = arg elif opt in ("-u", "--user"): adminUser = arg elif opt in ("-s", "--scheme"): scheme = arg elif opt in ("-v", "--updateversion"): if (arg.lower() == "false" or arg.lower() == "no"): updateversion = 'false' print 'scheme =', scheme, ', be host =', beHost, ', be port =', bePort, ', user =', adminUser, ', updateversion =', updateversion if (beHost == None): usage() sys.exit(3) results = importNormativeTypes(scheme, beHost, bePort, adminUser, "../../../import/tosca/normative-types/", updateversion) print "-----------------------------" for result in results: print "{0:20} | {1:6}".format(result[0], result[1]) print "-----------------------------" responseCodes = [200, 201] if (updateversion == 'false'): responseCodes = [200, 201, 409] failedNormatives = filter(lambda x: x[1] == None or x[1] not in responseCodes, results) if (len(failedNormatives) > 0): error_and_exit(1, None) else: error_and_exit(0, None) if __name__ == "__main__": main(sys.argv[1:])