Skip to content

Commit febb256

Browse files
committed
Add deployment script
1 parent 60898c8 commit febb256

7 files changed

Lines changed: 270 additions & 7 deletions

File tree

README.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,32 @@ This project is a mock of an extension for the Marketplace platform.
77
This mock only subscribes to platform events related to the **Order** business object. It provides a filter to only receive events when the attribute status of the order is `Processing`.
88
It just acknowledges the event and dumps the event data to stdout.
99

10+
11+
## Deployment
12+
13+
This project can be deployed to Kubernetes using the provided `deploy-mextmock.sh` script, which manages Helm deployments with environment-specific configurations.
14+
15+
### Prerequisites
16+
17+
- Helm 3.x installed
18+
- Access to a Kubernetes cluster
19+
- Valid extension ID in format `EXT-NNNN-NNNN` (case insensitive)
20+
21+
### Usage
22+
23+
```bash
24+
# Install a new extension
25+
./deploy-mextmock.sh install <extension_id> <api_key> [options]
26+
27+
# Upgrade an existing extension
28+
./deploy-mextmock.sh upgrade <extension_id> [options]
29+
```
30+
31+
### Options
32+
33+
| Option | Description | Default |
34+
|--------|-------------|---------|
35+
| `--environment <env>` | Target environment (dev, test, stage, prod) | `dev` |
36+
| `--namespace <ns>` or `-n <ns>` | Kubernetes namespace | `mpt-extensions` |
37+
| `--replicas <count>` | Number of pod replicas | `1` |
38+
| `--dry-run` | Show commands and templates without executing | - |

deploy-mextmock.sh

Lines changed: 220 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,220 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
# Determine the script directory and helm chart directory
5+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6+
HELM_CHART_DIR="${SCRIPT_DIR}/helm"
7+
8+
# Validate helm chart directory exists
9+
if [[ ! -d "$HELM_CHART_DIR" ]]; then
10+
echo "Error: Helm chart directory not found at: $HELM_CHART_DIR"
11+
echo "Expected to find Chart.yaml and templates/ directory"
12+
exit 1
13+
fi
14+
15+
# Function to validate extension ID format
16+
validate_extension_id() {
17+
local extension_id="$1"
18+
# Pattern: EXT-\d{4}-\d{4} (case insensitive)
19+
if [[ ! "$extension_id" =~ ^[Ee][Xx][Tt]-[0-9]{4}-[0-9]{4}$ ]]; then
20+
echo "Error: Invalid extension ID format: $extension_id"
21+
echo "Expected format: EXT-NNNN-NNNN (where N is a digit)"
22+
echo "Example: EXT-1234-5678"
23+
exit 1
24+
fi
25+
}
26+
27+
# Function to validate replicas count
28+
validate_replicas() {
29+
local replicas="$1"
30+
if [[ ! "$replicas" =~ ^[1-9][0-9]*$ ]]; then
31+
echo "Error: Invalid replicas count: $replicas"
32+
echo "Expected: positive integer (1, 2, 3, ...)"
33+
exit 1
34+
fi
35+
}
36+
37+
usage() {
38+
echo ""
39+
echo "Usage:"
40+
echo " $0 install <extension_id> <api_key> [--environment <env>] [--namespace <ns>] [--replicas <count>] [--dry-run]"
41+
echo " $0 upgrade <extension_id> [--environment <env>] [--namespace <ns>] [--replicas <count>] [--dry-run]"
42+
echo " $0 template <extension_id> [<api_key>] [--environment <env>] [--namespace <ns>] [--replicas <count>]"
43+
echo
44+
echo " <extension_id> must follow format: EXT-NNNN-NNNN (case insensitive)"
45+
echo " <env> can be: dev, test, stage, prod (default: dev)"
46+
echo " <ns> can be any valid Kubernetes namespace (default: mpt-extensions)"
47+
echo " <count> can be any positive integer (default: 1)"
48+
echo " --dry-run: Show commands and rendered templates without executing"
49+
echo " template: Only render and display the templates"
50+
echo ""
51+
exit 1
52+
}
53+
54+
if [[ $# -lt 2 ]]; then
55+
usage
56+
fi
57+
58+
command=$1
59+
shift
60+
61+
environment="dev"
62+
namespace="mpt-extensions"
63+
replicas=1
64+
dry_run=false
65+
args=()
66+
67+
# Parse arguments
68+
while [[ $# -gt 0 ]]; do
69+
case "$1" in
70+
--environment)
71+
environment="$2"
72+
shift 2
73+
;;
74+
--namespace|-n)
75+
namespace="$2"
76+
shift 2
77+
;;
78+
--replicas)
79+
replicas="$2"
80+
shift 2
81+
;;
82+
--dry-run)
83+
dry_run=true
84+
shift
85+
;;
86+
*)
87+
args+=("$1")
88+
shift
89+
;;
90+
esac
91+
done
92+
93+
# Map environment to domain
94+
case "$environment" in
95+
dev) domain="s1.today" ;;
96+
test) domain="s1.show" ;;
97+
stage) domain="s1.live" ;;
98+
prod) domain="platform.softwareone.com" ;;
99+
*)
100+
echo "Error: invalid environment '$environment'. Must be one of: dev, test, stage, prod."
101+
exit 1
102+
;;
103+
esac
104+
105+
if [[ "$command" == "install" ]]; then
106+
if [[ ${#args[@]} -lt 2 ]]; then
107+
echo "Error: install requires <extension_id> and <api_key>"
108+
usage
109+
fi
110+
extension_id="${args[0]}"
111+
api_key="${args[1]}"
112+
113+
# Validate extension ID format
114+
validate_extension_id "$extension_id"
115+
116+
# Validate replicas count
117+
validate_replicas "$replicas"
118+
119+
# Convert extension_id to lowercase and replace underscores with hyphens for release name
120+
release_name="mextmock-$(echo "${extension_id}" | tr '[:upper:]' '[:lower:]' | sed 's/_/-/g')"
121+
122+
helm_command="helm install \"${release_name}\" \"${HELM_CHART_DIR}\" \
123+
--namespace \"${namespace}\" \
124+
--set extensionId=\"${extension_id}\" \
125+
--set extensionApiKey=\"${api_key}\" \
126+
--set replicaCount=\"${replicas}\" \
127+
--set envDomain=\"${domain}\""
128+
129+
if [[ "$dry_run" == "true" ]]; then
130+
echo "=== DRY RUN MODE ==="
131+
echo "Command that would be executed:"
132+
echo "$helm_command"
133+
echo
134+
echo "=== RENDERED TEMPLATES ==="
135+
helm template "${release_name}" "${HELM_CHART_DIR}" \
136+
--namespace "${namespace}" \
137+
--set extensionId="${extension_id}" \
138+
--set extensionApiKey="${api_key}" \
139+
--set replicaCount="${replicas}" \
140+
--set envDomain="${domain}"
141+
else
142+
echo "Installing Helm release: ${release_name} (env: ${environment}, domain: ${domain})"
143+
eval "$helm_command"
144+
fi
145+
146+
elif [[ "$command" == "upgrade" ]]; then
147+
if [[ ${#args[@]} -lt 1 ]]; then
148+
echo "Error: upgrade requires <extension_id>"
149+
usage
150+
fi
151+
extension_id="${args[0]}"
152+
153+
# Validate extension ID format
154+
validate_extension_id "$extension_id"
155+
156+
# Validate replicas count
157+
validate_replicas "$replicas"
158+
159+
# Convert extension_id to lowercase and replace underscores with hyphens for release name
160+
release_name="mextmock-$(echo "${extension_id}" | tr '[:upper:]' '[:lower:]' | sed 's/_/-/g')"
161+
162+
helm_command="helm upgrade \"${release_name}\" \"${HELM_CHART_DIR}\" \
163+
--namespace \"${namespace}\" \
164+
--set extensionId=\"${extension_id}\" \
165+
--set replicaCount=\"${replicas}\" \
166+
--set envDomain=\"${domain}\" \
167+
--install"
168+
169+
if [[ "$dry_run" == "true" ]]; then
170+
echo "=== DRY RUN MODE ==="
171+
echo "Command that would be executed:"
172+
echo "$helm_command"
173+
echo
174+
echo "=== RENDERED TEMPLATES ==="
175+
helm template "${release_name}" "${HELM_CHART_DIR}" \
176+
--namespace "${namespace}" \
177+
--set extensionId="${extension_id}" \
178+
--set replicaCount="${replicas}" \
179+
--set envDomain="${domain}"
180+
else
181+
echo "Upgrading Helm release: ${release_name} (env: ${environment}, domain: ${domain})"
182+
eval "$helm_command"
183+
fi
184+
185+
elif [[ "$command" == "template" ]]; then
186+
if [[ ${#args[@]} -lt 1 ]]; then
187+
echo "Error: template requires <extension_id>"
188+
usage
189+
fi
190+
extension_id="${args[0]}"
191+
api_key="${args[1]:-default-api-key}"
192+
193+
# Validate extension ID format
194+
validate_extension_id "$extension_id"
195+
196+
# Validate replicas count
197+
validate_replicas "$replicas"
198+
199+
# Convert extension_id to lowercase and replace underscores with hyphens for release name
200+
release_name="mextmock-$(echo "${extension_id}" | tr '[:upper:]' '[:lower:]' | sed 's/_/-/g')"
201+
202+
echo "=== RENDERING TEMPLATES ==="
203+
echo "Extension ID: ${extension_id}"
204+
echo "Environment: ${environment}"
205+
echo "Domain: ${domain}"
206+
echo "Namespace: ${namespace}"
207+
echo "Replicas: ${replicas}"
208+
echo "Helm Chart Dir: ${HELM_CHART_DIR}"
209+
echo
210+
helm template "${release_name}" "${HELM_CHART_DIR}" \
211+
--namespace "${namespace}" \
212+
--set extensionId="${extension_id}" \
213+
--set extensionApiKey="${api_key}" \
214+
--set replicaCount="${replicas}" \
215+
--set envDomain="${domain}"
216+
217+
else
218+
echo "Error: unknown command '${command}'"
219+
usage
220+
fi

helm/Chart.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@ version: 1.0.0
1111

1212
# This is the version number of the application being deployed. This version number should be
1313
# incremented each time you make changes to the application.
14-
appVersion: "0.1.0"
14+
appVersion: "0.1.1"

helm/templates/_helpers.tpl

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,11 @@ If release name contains chart name it will be used as a full name.
1616
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
1717
{{- else -}}
1818
{{- $name := default .Chart.Name .Values.nameOverride -}}
19-
{{- if contains .Release.Name $name -}}
20-
{{- $name | trunc 63 | trimSuffix "-" -}}
19+
{{- $extensionId := .Values.extensionId | lower | replace "_" "-" -}}
20+
{{- if contains $name .Release.Name -}}
21+
{{- .Release.Name | trunc 63 | trimSuffix "-" -}}
2122
{{- else -}}
22-
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
23+
{{- printf "%s-%s" $name $extensionId | trunc 63 | trimSuffix "-" -}}
2324
{{- end -}}
2425
{{- end -}}
2526
{{- end -}}

helm/templates/configmap.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ metadata:
1010
data:
1111
SERVICE_NAME: {{ .Values.serviceName | quote }}
1212
MPT_EXTENSION_ID: {{ .Values.extensionId | quote }}
13+
MPT_ENV_DOMAIN: {{ .Values.envDomain | quote }}

helm/values.yaml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,18 @@
11
serviceName: mextmock
22
image:
33
repository: nlpapp0336cre.azurecr.io/gha/mextmock
4+
pullPolicy: IfNotPresent
45

56
extensionId: EXT-1234-5678
67
extensionApiKey: api-key
8+
envDomain: s1.today
9+
10+
replicaCount: 1
11+
12+
securityContext: {}
13+
14+
resources: {}
15+
16+
nodeSelector: {}
17+
18+
tolerations: []

settings.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
base_url: "https://api.s1.today/public/v1"
1+
env_domain: "s1.today"
2+
base_url: "@format https://api.{this.env_domain}/public/v1"
23
extension_id: "EXT-0000-1111"
3-
extension_domain: "ext.s1.today"
4+
extension_domain: "@format ext.{this.env_domain}"
45
extension_fqdn: "@jinja {{this.extension_id | lower}}.{{this.extension_domain}}"
5-

0 commit comments

Comments
 (0)