You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

DeployHelpers.py 2.8KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #coding=UTF-8
  2. ### Helper class for wildfly deployments. ###
  3. # Related files $HOME/.deploy-url $HOME/.deploy-credentials
  4. import sys, json
  5. try:
  6. import requests
  7. except Exception as e:
  8. print("DeployHelpers depends on requests library. Install it with `pip install requests`")
  9. sys.exit(1)
  10. from requests.auth import HTTPDigestAuth
  11. from os.path import join, expanduser, basename
  12. from BuildHelpers import parser, getArgs
  13. parser.add_argument("--deployUrl", help="Wildfly management URL")
  14. parser.add_argument("--deployUser", help="Deployment user", default=None)
  15. parser.add_argument("--deployPass", help="Deployment password", default=None)
  16. # Helper for handling the full deployment
  17. # name should end with .war
  18. def deployWar(warFile, name=None):
  19. if name is None:
  20. name = basename(warFile).replace('.war', "-%s.war" % (getArgs().version.split('-')[0]))
  21. print("Deploying to context %s" % (name[:-4]))
  22. # Undeploy/Remove old version if needed
  23. if deploymentExists(name):
  24. removeDeployment(name)
  25. # Do upload war file
  26. hash = doUploadWarFile(warFile)
  27. # Do deployment under name
  28. doDeploy(hash, name)
  29. def deploymentExists(name):
  30. # Deployment existence check data
  31. data = {"operation" : "read-attribute", "name": "runtime-name", "address": [{"deployment" : name}]}
  32. result = doPostJson(url=getUrl(), auth=getAuth(), data=json.dumps(data))
  33. return result.json()["outcome"] == "success"
  34. def doDeploy(hash, name):
  35. # Deployment data
  36. data = {}
  37. data["content"] = [{"hash" : hash}]
  38. data["address"] = [{"deployment" : name}]
  39. data["operation"] = "add"
  40. data["enabled"] = True
  41. return doPostJson(data=json.dumps(data), auth=getAuth(), url=getUrl())
  42. # Helper for adding Content-Type to headers
  43. def doPostJson(**kwargs):
  44. r = requests.post(headers={"Content-Type" : "application/json"}, **kwargs)
  45. # Wildfly gives code 500 when asking for a non-existent deployment
  46. if r.status_code == requests.codes.ok or r.status_code == 500:
  47. return r
  48. r.raise_for_status()
  49. def doUploadWarFile(warFile):
  50. # Upload request, just see the outcome
  51. result = requests.post("%s/add-content" % (getUrl()), files={"file" : open(warFile, 'rb')}, auth=getAuth()).json()
  52. if "outcome" not in result or result["outcome"] != "success":
  53. raise Exception("File upload failed.", result)
  54. return result["result"]
  55. # Method for removing an existing deployment
  56. def removeDeployment(name):
  57. data = {}
  58. data["address"] = [{"deployment" : name}]
  59. for i in ["undeploy", "remove"]:
  60. print("%s old deployment of %s" % (i, name))
  61. data["operation"] = i
  62. doPostJson(data=json.dumps(data), auth=getAuth(), url=getUrl())
  63. # Read credentials file and return a HTTPDigestAuth object
  64. def getAuth():
  65. args = getArgs()
  66. return HTTPDigestAuth(args.deployUser, args.deployPass)
  67. # Read the deploy url file and return the url
  68. def getUrl():
  69. return getArgs().deployUrl