|
2 | 2 |
|
3 | 3 | set -e -o pipefail -o nounset
|
4 | 4 |
|
5 |
| -OAUTH_CLIENT_ID="${OAUTH_CLIENT_ID:-sv_client}" |
6 |
| -export OAUTH_CLIENT_ID |
7 |
| - |
8 |
| -OAUTH_CLIENT_SECRET="${OAUTH_CLIENT_SECRET:-secret}" |
9 |
| -export OAUTH_CLIENT_SECRET |
10 |
| - |
11 |
| -ESP_NAMESPACE="${1}" |
12 |
| - |
| 5 | +#input variables |
| 6 | +ESP_NAMESPACE="${1}"; export ESP_NAMESPACE |
13 | 7 | ESP_PLUGIN_SOURCE="${2}"
|
14 |
| -export ESP_PLUGIN_SOURCE |
| 8 | +OAUTH_TYPE="${3:-uaa}" |
| 9 | + |
| 10 | +#optional environment variables - exported for use in other scripts |
| 11 | +OAUTH_CLIENT_ID="${OAUTH_CLIENT_ID:-sv_client}"; export OAUTH_CLIENT_ID |
| 12 | +OAUTH_CLIENT_SECRET="${OAUTH_CLIENT_SECRET:-secret}"; export OAUTH_CLIENT_SECRET |
| 13 | +KEYCLOAK_SUBPATH="${KEYCLOAK_SUBPATH:-auth}"; export KEYCLOAK_SUBPATH |
15 | 14 |
|
| 15 | +#optional environment variables |
16 | 16 | DRY_RUN="${DRY_RUN:-false}"
|
17 | 17 | INSTALL_GRAFANA="${INSTALL_GRAFANA:-false}"
|
18 |
| -GRAFANA_VERSION="${GRAFANA_VERSION:-'9.5.13'}" |
| 18 | +GRAFANA_VERSION="${GRAFANA_VERSION:-9.5.13}" |
| 19 | +GRAFANA_NAMESPACE="${GRAFANA_NAMESPACE:-${ESP_NAMESPACE}}" |
| 20 | + |
| 21 | +function check_requirements() { |
| 22 | + [ -z "$KUBECONFIG" ] && { |
| 23 | + echo "KUBECONFIG environment variable unset." >&2 |
| 24 | + exit 1 |
| 25 | + } |
| 26 | + |
| 27 | + [ -z "${ESP_NAMESPACE}" ] && { |
| 28 | + echo "Usage: ${0} <namespace> <plugin-zip-url> <oauth-type>" >&2 |
| 29 | + exit 1 |
| 30 | + } |
| 31 | + |
| 32 | + [ -z "${ESP_PLUGIN_SOURCE}" ] && { |
| 33 | + echo "Usage: ${0} <namespace> <plugin-zip-url> <oauth-type>" >&2 |
| 34 | + exit 1 |
| 35 | + } |
| 36 | + |
| 37 | + if ! kubectl get namespace "${ESP_NAMESPACE}" 2>/dev/null 1>&2; then |
| 38 | + echo >&2 "ERROR: Namespace ${ESP_NAMESPACE} not found." |
| 39 | + exit 1 |
| 40 | + fi |
| 41 | +} |
19 | 42 |
|
20 |
| -# Fetch access token to perform admin tasks: |
21 |
| -function fetch_uaa_admin_token() { |
22 |
| - _resp=$(curl "https://${ESP_DOMAIN}/uaa/oauth/token" -s -k -X POST \ |
23 |
| - -H 'Content-Type: application/x-www-form-urlencoded' \ |
24 |
| - -H 'Accept: application/json' \ |
25 |
| - -d "client_id=${UAA_ADMIN}&client_secret=${UAA_SECRET}&grant_type=client_credentials&response_type=token") |
| 43 | +function generate_manifests() { |
| 44 | + if [ -d "./manifests" ]; then |
| 45 | + echo "Existing manifest directory found." >&2 |
| 46 | + echo "Removing manifests..." |
| 47 | + rm -r ./manifests/ |
| 48 | + fi |
| 49 | + |
| 50 | + [ -d "./manifests" ] || mkdir "manifests" |
| 51 | + cp -r *.yaml manifests/ |
| 52 | + |
| 53 | + for file in `find ./manifests/ -name "*.y*ml"` ; do |
| 54 | + |
| 55 | + sed -i 's|TEMPLATE_AUTH_URL|'$TEMPLATE_AUTH_URL'|g' $file |
| 56 | + sed -i 's|TEMPLATE_TOKEN_URL|'$TEMPLATE_TOKEN_URL'|g' $file |
| 57 | + sed -i 's|TEMPLATE_API_URL|'$TEMPLATE_API_URL'|g' $file |
| 58 | + sed -i 's|TEMPLATE_SIGNOUT_REDIRECT_URL|'$TEMPLATE_SIGNOUT_REDIRECT_URL'|g' $file |
| 59 | + |
| 60 | + sed -i 's|TEMPLATE_GRAFANA_DOMAIN|'$GRAFANA_DOMAIN'|g' $file |
| 61 | + sed -i 's|TEMPLATE_ESP_DOMAIN|'$ESP_DOMAIN'|g' $file |
| 62 | + sed -i 's|TEMPLATE_OAUTH_CLIENT_ID|'$OAUTH_CLIENT_ID'|g' $file |
| 63 | + sed -i 's|TEMPLATE_OAUTH_CLIENT_SECRET|'$OAUTH_CLIENT_SECRET'|g' $file |
| 64 | + sed -i 's|TEMPLATE_ESP_PLUGIN_SOURCE|'$ESP_PLUGIN_SOURCE'|g' $file |
| 65 | + sed -i 's|TEMPLATE_GRAFANA_VERSION|'$GRAFANA_VERSION'|g' $file |
| 66 | + |
| 67 | + if [[ "${DRY_RUN}" == true ]]; then |
| 68 | + echo $file |
| 69 | + cat $file |
| 70 | + fi |
26 | 71 |
|
27 |
| - echo "${_resp}" | jq -r '.access_token' |
| 72 | + done |
28 | 73 | }
|
29 | 74 |
|
30 |
| -# Add Grafana generic OAuth to allowed auth redirects: |
31 |
| -function add_grafana_auth_redirect() { |
32 |
| - _token="$(fetch_uaa_admin_token)" |
33 |
| - _redirect="https://${ESP_DOMAIN}/grafana/login/generic_oauth" |
| 75 | +check_requirements |
34 | 76 |
|
35 |
| - _config=$(curl -s -k -X GET "https://${ESP_DOMAIN}/uaa/oauth/clients/${OAUTH_CLIENT_ID}" -H "Authorization: Bearer ${_token}") |
| 77 | +echo "Fetching required deployment information..." |
| 78 | +ESP_DOMAIN=$(kubectl -n "${ESP_NAMESPACE}" get ingress --output json | jq -r '.items[0].spec.rules[0].host') |
| 79 | +export ESP_DOMAIN |
36 | 80 |
|
37 |
| - _update_body=$(echo "${_config}" | jq -c -r --arg redirect "${_redirect}" \ |
38 |
| - '.redirect_uri += [$redirect] | {client_id: .client_id, redirect_uri: .redirect_uri}') |
| 81 | +GRAFANA_DOMAIN=$(kubectl -n "${GRAFANA_NAMESPACE}" get ingress --output json | jq -r '.items[0].spec.rules[0].host') |
39 | 82 |
|
40 |
| - _resp=$(curl "https://${ESP_DOMAIN}/uaa/oauth/clients/${OAUTH_CLIENT_ID}" -s -k -X PUT \ |
41 |
| - -o /dev/null -w "%{http_code}" \ |
42 |
| - -H 'Content-Type: application/json' \ |
43 |
| - -H "Authorization: Bearer ${_token}" \ |
44 |
| - -H 'Accept: application/json' \ |
45 |
| - -d "${_update_body}") |
| 83 | +echo "Adding Grafana to allowed OAuth client redirects..." |
| 84 | +if [ "${OAUTH_TYPE}" == "viya" ]; then |
46 | 85 |
|
47 |
| - if [ "${_resp}" == '200' ]; then |
48 |
| - echo " Grafana OAuth redirect added." |
49 |
| - else |
50 |
| - echo >&2 "ERROR: OAuth client redirect update failed with status code ${_resp}." |
51 |
| - exit 1 |
52 |
| - fi |
53 |
| -} |
| 86 | + if [[ "${DRY_RUN}" == false ]]; then |
| 87 | + bash register-oauth-client-viya.sh |
| 88 | + fi |
54 | 89 |
|
55 |
| -[ -z "$KUBECONFIG" ] && { |
56 |
| - echo "KUBECONFIG environment variable unset." >&2 |
57 |
| - exit 1 |
58 |
| -} |
| 90 | + TEMPLATE_AUTH_URL="https://${ESP_DOMAIN}/SASLogon/oauth/authorize" |
| 91 | + TEMPLATE_TOKEN_URL="https://${ESP_DOMAIN}/SASLogon/oauth/token" |
| 92 | + TEMPLATE_API_URL="https://${ESP_DOMAIN}/SASLogon/userinfo" |
| 93 | + TEMPLATE_SIGNOUT_REDIRECT_URL="https://${ESP_DOMAIN}/SASLogon/logout.do" |
59 | 94 |
|
60 |
| -[ -z "${ESP_NAMESPACE}" ] && { |
61 |
| - echo "Usage: ${0} <namespace> <plugin-zip-url>" >&2 |
62 |
| - exit 1 |
63 |
| -} |
| 95 | +elif [ "${OAUTH_TYPE}" == "keycloak" ]; then |
64 | 96 |
|
65 |
| -[ -z "${ESP_PLUGIN_SOURCE}" ] && { |
66 |
| - echo "Usage: ${0} <namespace> <plugin-zip-url>" >&2 |
67 |
| - exit 1 |
68 |
| -} |
| 97 | + if [[ "${DRY_RUN}" == false ]]; then |
| 98 | + bash register-oauth-client-keycloak.sh |
| 99 | + fi |
69 | 100 |
|
70 |
| -if [ -d "./manifests" ]; then |
71 |
| - echo "Existing manifest directory found." >&2 |
72 |
| - echo "Removing manifests..." |
73 |
| - rm -r ./manifests/ |
74 |
| -fi |
| 101 | + TEMPLATE_AUTH_URL="https://${ESP_DOMAIN}/${KEYCLOAK_SUBPATH}/realms/sas-esp/protocol/openid-connect/auth" |
| 102 | + TEMPLATE_TOKEN_URL="https://${ESP_DOMAIN}/${KEYCLOAK_SUBPATH}/realms/sas-esp/protocol/openid-connect/token" |
| 103 | + TEMPLATE_API_URL="https://${ESP_DOMAIN}/${KEYCLOAK_SUBPATH}/realms/sas-esp/protocol/openid-connect/userinfo" |
| 104 | + TEMPLATE_SIGNOUT_REDIRECT_URL="https://${ESP_DOMAIN}/${KEYCLOAK_SUBPATH}/realms/sas-esp/protocol/openid-connect/logout?client_id=${OAUTH_CLIENT_ID}\&post_logout_redirect_uri=https://${ESP_DOMAIN}/grafana/login" |
75 | 105 |
|
76 |
| -echo "Fetching required deployment information..." |
77 |
| -ESP_DOMAIN=$(kubectl -n "${ESP_NAMESPACE}" get ingress --output json | jq -r '.items[0].spec.rules[0].host') |
78 |
| -export ESP_DOMAIN |
| 106 | +else |
79 | 107 |
|
80 |
| -_uaa_secret_data=$(kubectl -n "${ESP_NAMESPACE}" get secret uaa-secret --output json) |
81 |
| -UAA_ADMIN=$(echo "${_uaa_secret_data}" | jq -r '.data.username | @base64d') |
82 |
| -export UAA_ADMIN |
83 |
| -UAA_SECRET=$(echo "${_uaa_secret_data}" | jq -r '.data.password | @base64d') |
84 |
| -export UAA_SECRET |
| 108 | + if [[ "${DRY_RUN}" == false ]]; then |
| 109 | + bash register-oauth-client-uaa.sh |
| 110 | + fi |
| 111 | + |
| 112 | + TEMPLATE_AUTH_URL="https://${ESP_DOMAIN}/uaa/oauth/authorize" |
| 113 | + TEMPLATE_TOKEN_URL="https://${ESP_DOMAIN}/uaa/oauth/token?token_format=jwt" |
| 114 | + TEMPLATE_API_URL="https://${ESP_DOMAIN}/uaa/userinfo" |
| 115 | + TEMPLATE_SIGNOUT_REDIRECT_URL="https://${ESP_DOMAIN}/oauth2/sign_out?rd=https://${ESP_DOMAIN}/uaa/logout.do?redirect=https://${ESP_DOMAIN}/uaa/login" |
| 116 | + |
| 117 | +fi |
85 | 118 |
|
86 | 119 | cat <<EOF
|
87 | 120 | Deployment details:
|
88 | 121 | ESP domain: ${ESP_DOMAIN}
|
89 |
| - UAA admin user: ${UAA_ADMIN} |
90 |
| - UAA admin secret: **** |
91 | 122 | OAuth client ID: ${OAUTH_CLIENT_ID}
|
92 | 123 | OAuth client secret: ****
|
93 | 124 | Deploying Grafana with values:
|
94 | 125 | ESP plugin source: ${ESP_PLUGIN_SOURCE}
|
95 | 126 | EOF
|
96 | 127 |
|
97 |
| -echo "Adding Grafana to allowed OAuth client redirects..." |
98 |
| -add_grafana_auth_redirect |
99 |
| - |
100 | 128 | echo "Generating manifests..."
|
101 |
| -[ -d "./manifests" ] || mkdir "manifests" |
102 |
| -cp -r *.yaml manifests/ |
103 |
| - |
104 |
| -find ./manifests/ -type f -name "*.yaml" -exec perl -pi -e 's/\QTEMPLATE_ESP_DOMAIN/$ENV{"ESP_DOMAIN"}/g' '{}' + |
105 |
| -find ./manifests/ -type f -name "*.yaml" -exec perl -pi -e 's/\QTEMPLATE_OAUTH_CLIENT_ID/$ENV{"OAUTH_CLIENT_ID"}/g' '{}' + |
106 |
| -find ./manifests/ -type f -name "*.yaml" -exec perl -pi -e 's/\QTEMPLATE_OAUTH_CLIENT_SECRET/$ENV{"OAUTH_CLIENT_SECRET"}/g' '{}' + |
107 |
| -find ./manifests/ -type f -name "*.yaml" -exec perl -pi -e 's/\QTEMPLATE_ESP_PLUGIN_SOURCE/$ENV{"ESP_PLUGIN_SOURCE"}/g' '{}' + |
108 |
| -find ./manifests/ -type f -name "*.yaml" -exec perl -pi -e 's/\QTEMPLATE_GRAFANA_VERSION/$ENV{"GRAFANA_VERSION"}/g' '{}' + |
| 129 | +generate_manifests |
109 | 130 |
|
110 | 131 | if [[ "${DRY_RUN}" == true ]]; then
|
111 |
| - echo "Dry run specified. Printing manifests to be applied:" |
112 |
| - echo "./manifests/config-map.yaml" |
113 |
| - cat ./manifests/config-map.yaml |
114 |
| - echo "./manifests/patch-grafana.yaml" |
115 |
| - cat ./manifests/patch-grafana.yaml |
116 |
| - exit 0 |
| 132 | + exit 0 |
117 | 133 | fi
|
118 | 134 |
|
119 | 135 | if [[ "${INSTALL_GRAFANA}" == true ]]; then
|
|
0 commit comments