Skip to content

Commit 7fdef76

Browse files
committed
cca_operator: add_domain_to_traefik function, improvements to update/create instance
1 parent 97adab7 commit 7fdef76

5 files changed

Lines changed: 54 additions & 69 deletions

File tree

cca-operator/functions.sh

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,3 +139,38 @@ instance_domain() {
139139
CKAN_VALUES_FILE="${1}"
140140
python3 -c 'import yaml; print(yaml.load(open("'${CKAN_VALUES_FILE}'")).get("domain", ""))'
141141
}
142+
143+
add_domain_to_traefik() {
144+
export DOMAIN="${1}"
145+
export WITH_SANS_SSL="${2}"
146+
export INSTANCE_ID="${3}"
147+
( [ -z "${DOMAIN}" ] || [ -z "${INSTANCE_ID}" ] ) && echo missing required args && return 1
148+
! python3 -c 'import toml' && python3 -m pip install toml
149+
export TEMPFILE=`mktemp` &&\
150+
kubectl $KUBECTL_GLOBAL_ARGS -n default get configmap etc-traefik -o yaml \
151+
| python3 -c '
152+
import sys, yaml, toml, os
153+
conf = toml.loads(yaml.load(sys.stdin)["data"]["traefik.toml"])
154+
domain = os.environ["DOMAIN"]
155+
with_sans_ssl = os.environ["WITH_SANS_SSL"]
156+
instance_id = os.environ["INSTANCE_ID"]
157+
if instance_id in conf["backends"] or instance_id in conf["frontends"]:
158+
print(f"Warning! Instance ID {instance_id} already configured in traefik backends or frontends", file=sys.stderr)
159+
exit(0)
160+
conf["frontends"][instance_id] = {"backend": instance_id, "headers": {"SSLRedirect": True}, "passHostHeader": True,
161+
"routes": {"route1": {"rule": f"Host:{domain}"}}}
162+
conf["backends"][instance_id] = {"servers": {"server1": {"url": f"http://nginx.{instance_id}:8080"}}}
163+
if with_sans_ssl == "1":
164+
main_domain = conf["acme"]["domains"][0]["main"]
165+
assert domain.endswith(f".{main_domain}"), f"Invalid domain {domain} - must be subdomain of the main domain {main_domain}"
166+
conf["acme"]["domains"][0]["sans"].append(domain)
167+
print(toml.dumps(conf))
168+
exit(0)' > $TEMPFILE &&\
169+
kubectl $KUBECTL_GLOBAL_ARGS delete configmap etc-traefik &&\
170+
kubectl $KUBECTL_GLOBAL_ARGS create configmap etc-traefik --from-file=traefik.toml=$TEMPFILE &&\
171+
rm $TEMPFILE &&\
172+
kubectl $KUBECTL_GLOBAL_ARGS patch deployment traefik -p "{\"spec\":{\"template\":{\"metadata\":{\"labels\":{\"date\":\"`date +'%s'`\"}}}}}" &&\
173+
kubectl $KUBECTL_GLOBAL_ARGS rollout status deployment traefik
174+
[ "$?" != "0" ] && echo Failed to add domain to traefik && return 1
175+
return 0
176+
}

cca-operator/update-instance.sh

Lines changed: 6 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -12,27 +12,27 @@ echo Creating instance: ${INSTANCE_ID}
1212
INSTANCE_DOMAIN=`python3 -c '
1313
import yaml;
1414
print(yaml.load(open("'${CKAN_VALUES_FILE}'")).get("domain", ""))
15-
'`
15+
' 2>/dev/null`
1616

1717
WITH_SANS_SSL=`python3 -c '
1818
import yaml;
1919
print("1" if yaml.load(open("'${CKAN_VALUES_FILE}'")).get("withSansSSL", False) else "0")
20-
'`
20+
' 2>/dev/null`
2121

2222
REGISTER_SUBDOMAIN=`python3 -c '
2323
import yaml;
2424
print(yaml.load(open("'${CKAN_VALUES_FILE}'")).get("registerSubdomain", ""))
25-
'`
25+
' 2>/dev/null`
2626

2727
CKAN_HELM_CHART_REPO=`python3 -c '
2828
import yaml;
2929
print(yaml.load(open("'${CKAN_VALUES_FILE}'")).get("ckanHelmChartRepo", "https://raw.githubusercontent.com/ViderumGlobal/ckan-cloud-helm/master/charts_repository"))
30-
'`
30+
' 2>/dev/null`
3131

3232
CKAN_HELM_CHART_VERSION=`python3 -c '
3333
import yaml;
3434
print(yaml.load(open("'${CKAN_VALUES_FILE}'")).get("ckanHelmChartVersion", ""))
35-
'`
35+
' 2>/dev/null`
3636

3737
LOAD_BALANCER_HOSTNAME=$(kubectl $KUBECTL_GLOBAL_ARGS -n default get service traefik -o yaml \
3838
| python3 -c 'import sys, yaml; print(yaml.load(sys.stdin)["status"]["loadBalancer"]["ingress"][0]["hostname"])' 2>/dev/null)
@@ -43,68 +43,7 @@ if [ "${REGISTER_SUBDOMAIN}" != "" ]; then
4343
fi
4444

4545
if ! [ -z "${INSTANCE_DOMAIN}" ]; then
46-
if grep 'rule = "Host:'${INSTANCE_DOMAIN}'"' /etc/ckan-cloud/traefik-values.yaml; then
47-
echo Skipping load balancer deployment
48-
echo instance domain already exists in load balancer values: ${INSTANCE_DOMAIN}
49-
else
50-
echo Configuring load balancer for domain "${INSTANCE_DOMAIN}"
51-
cp -f "${TRAEFIK_VALUES_FILE}" /etc/ckan-cloud/backups/traefik-values.yaml.`date +%Y-%m-%d_%H-%M` &&\
52-
cp -f "${TRAEFIK_VALUES_FILE}" /etc/ckan-cloud/backups/traefik-values.yaml.last
53-
[ "$?" != "0" ] && exit 1
54-
55-
TRAEFIK_VALUES_MODIFIED_FILE=/etc/ckan-cloud/traefik-values.yaml
56-
57-
if [ "${WITH_SANS_SSL}" == "1" ]; then
58-
echo Configuring SSL
59-
TEMPFILE=`mktemp`
60-
python3 -c '
61-
import yaml, json;
62-
traefik_values = yaml.load(open("'${TRAEFIK_VALUES_MODIFIED_FILE}'"));
63-
def acme_domains():
64-
for line in traefik_values["acmeDomains"].splitlines():
65-
if line.startswith(" sans = ["):
66-
line = " sans = " + json.dumps(json.loads(line.strip().split(" = ")[1]) + ["'${INSTANCE_DOMAIN}'"])
67-
yield line
68-
print(yaml.dump(dict(traefik_values, acmeDomains="\n".join(acme_domains())),
69-
default_flow_style=False));
70-
' > $TEMPFILE
71-
[ "$?" != "0" ] && exit 1
72-
TRAEFIK_VALUES_MODIFIED_FILE=$TEMPFILE
73-
fi
74-
75-
TEMPFILE=`mktemp`
76-
python3 -c '
77-
import yaml;
78-
traefik_values = yaml.load(open("'${TRAEFIK_VALUES_MODIFIED_FILE}'"));
79-
traefik_values["backends"] += " \n\
80-
[backends.'${INSTANCE_ID}'] \n\
81-
[backends.'${INSTANCE_ID}'.servers.server1] \n\
82-
url = \"http://nginx.'${INSTANCE_NAMESPACE}'\" \n\
83-
";
84-
traefik_values["frontends"] += " \n\
85-
[frontends.'${INSTANCE_ID}'] \n\
86-
backend=\"'${INSTANCE_ID}'\" \n\
87-
passHostHeader = true \n\
88-
[frontends.'${INSTANCE_ID}'.headers] \n\
89-
SSLRedirect = true \n\
90-
[frontends.'${INSTANCE_ID}'.routes.route1] \n\
91-
rule = \"Host:'${INSTANCE_DOMAIN}'\" \n\
92-
";
93-
print(yaml.dump(traefik_values, default_flow_style=False));
94-
' > $TEMPFILE
95-
[ "$?" != "0" ] && exit 1
96-
TRAEFIK_VALUES_MODIFIED_FILE=$TEMPFILE
97-
98-
mv $TRAEFIK_VALUES_MODIFIED_FILE $TRAEFIK_VALUES_FILE
99-
100-
echo Deploying to kube context `kubectl $KUBECTL_GLOBAL_ARGS config current-context`, load balancer hostname: ${LOAD_BALANCER_HOSTNAME}
101-
102-
helm upgrade "${TRAEFIK_HELM_RELEASE_NAME}" "${TRAEFIK_HELM_CHART_PATH}" \
103-
--namespace "${TRAEFIK_NAMESPACE}" -if "${TRAEFIK_VALUES_FILE}" --dry-run --debug > /dev/stderr &&\
104-
helm upgrade "${TRAEFIK_HELM_RELEASE_NAME}" "${TRAEFIK_HELM_CHART_PATH}" \
105-
--namespace "${TRAEFIK_NAMESPACE}" -if "${TRAEFIK_VALUES_FILE}"
106-
[ "$?" != "0" ] && exit 1
107-
fi
46+
! add_domain_to_traefik "${INSTANCE_DOMAIN}" "${WITH_SANS_SSL}" "${INSTANCE_ID}" && exit 1
10847
fi
10948

11049
if kubectl $KUBECTL_GLOBAL_ARGS get ns "${INSTANCE_NAMESPACE}"; then

jenkins/scripts/create_instance.sh

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
#!/usr/bin/env bash
22

3-
echo "${VALUES}" | tee /dev/stdout | /etc/ckan-cloud/cca_operator.sh ./set-instance-values.sh ${INSTANCE_ID} &&\
3+
if ! [ -z "${VALUES}" ]; then
4+
! echo "${VALUES}" | tee /dev/stderr | /etc/ckan-cloud/cca_operator.sh ./set-instance-values.sh ${INSTANCE_ID} && exit 1
5+
fi
6+
47
/etc/ckan-cloud/cca_operator.sh ./create-instance.sh ${INSTANCE_ID}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
#!/usr/bin/env bash
2+
3+
export QUIET=1
4+
/etc/ckan-cloud/cca_operator.sh ./get-instance-values.sh "${INSTANCE_ID}" \
5+
| python3 -c "
6+
import yaml, sys;
7+
print(yaml.dump(yaml.load(sys.stdin), default_flow_style=False, indent=2, width=99999, allow_unicode=True))
8+
"

jenkins/scripts/update_instance.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,5 @@ values = yaml.load(open("'${VALUES_TEMPFILE}'"))
1414
values.update(**yaml.load(sys.stdin))
1515
print(yaml.dump(values, default_flow_style=False, allow_unicode=True))
1616
' > $TEMPFILE &&\
17-
cat $TEMPFILE | tee /dev/stdout | /etc/ckan-cloud/cca_operator.sh ./set-instance-values.sh ${INSTANCE_ID} &&\
17+
cat $TEMPFILE | tee /dev/stderr | /etc/ckan-cloud/cca_operator.sh ./set-instance-values.sh ${INSTANCE_ID} &&\
1818
/etc/ckan-cloud/cca_operator.sh ${UPDATE_INSTANCE_COMMAND:-./update-instance.sh} ${INSTANCE_ID}

0 commit comments

Comments
 (0)