goldAllocationManager.py
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:4k
源码类别:

网格计算

开发平台:

Java

  1. #Licensed to the Apache Software Foundation (ASF) under one
  2. #or more contributor license agreements.  See the NOTICE file
  3. #distributed with this work for additional information
  4. #regarding copyright ownership.  The ASF licenses this file
  5. #to you under the Apache License, Version 2.0 (the
  6. #"License"); you may not use this file except in compliance
  7. #with the License.  You may obtain a copy of the License at
  8. #     http://www.apache.org/licenses/LICENSE-2.0
  9. #Unless required by applicable law or agreed to in writing, software
  10. #distributed under the License is distributed on an "AS IS" BASIS,
  11. #WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. #See the License for the specific language governing permissions and
  13. #limitations under the License.
  14. """Gold Allocation Manager Implementation"""
  15. # -*- python -*-
  16. import sys, httplib
  17. import sha, base64, hmac
  18. import xml.dom.minidom
  19. from hodlib.Common.util import *
  20. class goldAllocationManager:
  21.   def __init__(self, cfg, log):
  22.     self.__GOLD_SECRET_KEY_FILE = cfg['auth-file']
  23.     (self.__goldHost, self.__goldPort) = (cfg['allocation-manager-address'][0], 
  24.                                           cfg['allocation-manager-address'][1])
  25.     self.cfg = cfg
  26.     self.log = log
  27.   def getQuote(self, user, project, ignoreErrors=True):
  28.     # Get Secret Key from File
  29.     secret = ''
  30.     try:
  31.       secretFile = open(self.__GOLD_SECRET_KEY_FILE)
  32.       secret = secretFile.readline()
  33.     except Exception, e:
  34.       self.log.error("Unable to open file %s" % self.__GOLD_SECRET_KEY_FILE)
  35.       self.log.debug(get_exception_string())
  36.       return (ignoreErrors or False)
  37.     secretFile.close()
  38.     secret = secret.rstrip()
  39.     # construct the SSRMAP request body 
  40.     body = '<Body><Request action="Quote" actor="hod"><Object>Job</Object><Data><Job><ProjectId>%s</ProjectId><UserId>%s</UserId><WallDuration>10</WallDuration></Job></Data></Request></Body>' % (project, user)
  41.     # compute digest
  42.     message = sha.new()
  43.     message.update(body)
  44.     digest = message.digest()
  45.     digestStr = base64.b64encode(digest)
  46.     # compute signature
  47.     message = hmac.new(secret, digest, sha)
  48.     signatureStr = base64.b64encode(message.digest())
  49.     # construct the SSSRMAP Message
  50.     sssrmapRequest = '<?xml version="1.0" encoding="UTF-8"?>
  51. <Envelope>%s<Signature><DigestValue>%s</DigestValue><SignatureValue>%s</SignatureValue><SecurityToken type="Symmetric"></SecurityToken></Signature></Envelope>' % (body, digestStr, signatureStr)
  52.     self.log.info('sssrmapRequest: %s' % sssrmapRequest)
  53.     try:
  54.       # post message to GOLD server
  55.       webservice = httplib.HTTP(self.__goldHost, self.__goldPort)
  56.       webservice.putrequest("POST", "/SSSRMAP3 HTTP/1.1")
  57.       webservice.putheader("Content-Type", "text/xml; charset="utf-8"")
  58.       webservice.putheader("Transfer-Encoding", "chunked")
  59.       webservice.endheaders()
  60.       webservice.send("%X" % len(sssrmapRequest) + "rn" + sssrmapRequest + '0rn')
  61.       # handle the response
  62.       statusCode, statusmessage, header = webservice.getreply()
  63.       responseStr = webservice.getfile().read()
  64.       self.log.debug("httpStatusCode: %d" % statusCode)
  65.       self.log.info('responseStr: %s' % responseStr)
  66.       # parse XML response
  67.       if (statusCode == 200):
  68.         responseArr = responseStr.split("n")
  69.         responseBody = responseArr[2]
  70.         try:
  71.           doc = xml.dom.minidom.parseString(responseBody)
  72.           responseVal = doc.getElementsByTagName("Value")[0].firstChild.nodeValue
  73.           self.log.info("responseVal: %s" % responseVal)
  74.           if (responseVal == 'Success'):
  75.             return True
  76.           else:
  77.             return False
  78.         except Exception, e:
  79.           self.log.error("Unable to parse GOLD responseBody XML "(%s)" to get responseVal" % (responseBody))
  80.           self.log.debug(get_exception_string())
  81.           return (ignoreErrors or False)
  82.       else:
  83.         self.log.error("Invalid HTTP statusCode %d" % statusCode)
  84.     except Exception, e:
  85.       self.log.error("Unable to POST message to GOLD server (%s, %d)" %
  86.                        (self.__goldHost, self.__goldPort))
  87.       self.log.debug(get_exception_string())
  88.       return (ignoreErrors or False)
  89.     return True