summaryrefslogtreecommitdiffstats
path: root/scripts/DeployHelpers.py
blob: 2c879088ffae77ad997b01b1f9f2b9545a039d74 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#coding=UTF-8

### Helper class for wildfly deployments. ###
# Related files $HOME/.deploy-url $HOME/.deploy-credentials

import sys, json
try:
	import requests
except Exception as e:
	print("DeployHelpers depends on requests library. Install it with `pip install requests`")
	sys.exit(1)
from requests.auth import HTTPDigestAuth
from os.path import join, expanduser, basename
from BuildHelpers import parser, getArgs

parser.add_argument("--deployUrl", help="Wildfly management URL")
parser.add_argument("--deployUser", help="Deployment user", default=None)
parser.add_argument("--deployPass", help="Deployment password", default=None)

# Helper for handling the full deployment
# name should end with .war
def deployWar(warFile, name=None):
	if name is None:
		name = basename(warFile).replace('.war', "-%s.war" % (getArgs().version.split('-')[0]))

	print("Deploying to context %s" % (name[:-4]))
	# Undeploy/Remove old version if needed
	if deploymentExists(name):
		removeDeployment(name)
	# Do upload war file
	hash = doUploadWarFile(warFile)
	# Do deployment under name
	doDeploy(hash, name)

def deploymentExists(name):
	# Deployment existence check data
	data = {"operation" : "read-attribute", "name": "runtime-name", "address": [{"deployment" : name}]}
	result = doPostJson(url=getUrl(), auth=getAuth(), data=json.dumps(data))
	return result.json()["outcome"] == "success"

def doDeploy(hash, name):
	# Deployment data
	data = {}
	data["content"] = [{"hash" : hash}]
	data["address"] = [{"deployment" : name}]
	data["operation"] = "add"
	data["enabled"] = True
	return doPostJson(data=json.dumps(data), auth=getAuth(), url=getUrl())

# Helper for adding Content-Type to headers
def doPostJson(**kwargs):
	r = requests.post(headers={"Content-Type" : "application/json"}, **kwargs)
	# Wildfly gives code 500 when asking for a non-existent deployment
	if r.status_code == requests.codes.ok or r.status_code == 500:
		return r
	r.raise_for_status()

def doUploadWarFile(warFile):
	# Upload request, just see the outcome
	result = requests.post("%s/add-content" % (getUrl()), files={"file" : open(warFile, 'rb')}, auth=getAuth()).json()
	if "outcome" not in result or result["outcome"] != "success":
		raise Exception("File upload failed.", result)
	return result["result"]

# Method for removing an existing deployment
def removeDeployment(name):
	data = {}
	data["address"] = [{"deployment" : name}]
	for i in ["undeploy", "remove"]:
		print("%s old deployment of %s" % (i, name))
		data["operation"] = i
		doPostJson(data=json.dumps(data), auth=getAuth(), url=getUrl())

# Read credentials file and return a HTTPDigestAuth object
def getAuth():
	args = getArgs()
	return HTTPDigestAuth(args.deployUser, args.deployPass)

# Read the deploy url file and return the url
def getUrl():
	return getArgs().deployUrl