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 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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. from time import sleep
  14. parser.add_argument("--deployUrl", help="Wildfly management URL")
  15. parser.add_argument("--deployUser", help="Deployment user", default=None)
  16. parser.add_argument("--deployPass", help="Deployment password", default=None)
  17. serverUp = None
  18. def testServer():
  19. global serverUp
  20. if serverUp is not None:
  21. return serverUp
  22. if getUrl() is None:
  23. print("No deploy URL provided")
  24. serverUp = False
  25. return serverUp
  26. print("Checking server status")
  27. i = 0
  28. request = {"operation" : "read-attribute", "name" : "server-state"}
  29. serverUp = False
  30. while not serverUp and i < 2:
  31. try:
  32. print("Trying on url %s" % (getUrl()))
  33. result = doPostJson(url=getUrl(), auth=getAuth(), data=json.dumps(request))
  34. response = result.json()
  35. if "outcome" not in response or response["outcome"] != "success":
  36. # Failure
  37. raise Exception(response)
  38. elif "result" not in response or response["result"] != "running":
  39. # Another failure
  40. raise Exception(response)
  41. # All OK
  42. serverUp = True
  43. print("Got server connection.")
  44. except Exception as e:
  45. print("Exception while checking server state: ", e)
  46. print("Server connection failed, retrying in 5 seconds.")
  47. i = i + 1
  48. sleep(5)
  49. return serverUp
  50. # Helper for handling the full deployment
  51. # name should end with .war
  52. def deployWar(warFile, name=None):
  53. if not testServer():
  54. raise Exception("Server not up. Skipping deployment.")
  55. return
  56. if name is None:
  57. name = basename(warFile).replace('.war', "-%s.war" % (getArgs().version.split('-')[0]))
  58. print("Deploying to context %s" % (name[:-4]))
  59. # Undeploy/Remove old version if needed
  60. if deploymentExists(name):
  61. removeDeployment(name)
  62. # Do upload war file
  63. hash = doUploadWarFile(warFile)
  64. # Do deployment under name
  65. doDeploy(hash, name)
  66. def deploymentExists(name):
  67. # Deployment existence check data
  68. data = {"operation" : "read-attribute", "name": "runtime-name", "address": [{"deployment" : name}]}
  69. result = doPostJson(url=getUrl(), auth=getAuth(), data=json.dumps(data))
  70. return result.json()["outcome"] == "success"
  71. def doDeploy(hash, name):
  72. # Deployment data
  73. data = {}
  74. data["content"] = [{"hash" : hash}]
  75. data["address"] = [{"deployment" : name}]
  76. data["operation"] = "add"
  77. data["enabled"] = True
  78. return doPostJson(data=json.dumps(data), auth=getAuth(), url=getUrl())
  79. # Helper for adding Content-Type to headers
  80. def doPostJson(**kwargs):
  81. r = requests.post(headers={"Content-Type" : "application/json"}, **kwargs)
  82. # Wildfly gives code 500 when asking for a non-existent deployment
  83. if r.status_code == requests.codes.ok or r.status_code == 500:
  84. return r
  85. r.raise_for_status()
  86. def doUploadWarFile(warFile):
  87. # Upload request, just see the outcome
  88. result = requests.post("%s/add-content" % (getUrl()), files={"file" : open(warFile, 'rb')}, auth=getAuth()).json()
  89. if "outcome" not in result or result["outcome"] != "success":
  90. raise Exception("File upload failed.", result)
  91. return result["result"]
  92. # Method for removing an existing deployment
  93. def removeDeployment(name):
  94. data = {}
  95. data["address"] = [{"deployment" : name}]
  96. for i in ["undeploy", "remove"]:
  97. print("%s old deployment of %s" % (i, name))
  98. data["operation"] = i
  99. doPostJson(data=json.dumps(data), auth=getAuth(), url=getUrl())
  100. # Read credentials file and return a HTTPDigestAuth object
  101. def getAuth():
  102. args = getArgs()
  103. return HTTPDigestAuth(args.deployUser, args.deployPass)
  104. # Read the deploy url file and return the url
  105. def getUrl():
  106. return getArgs().deployUrl