Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

DeployHelpers.py 3.7KB

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