Skip to content

Commit c2a6353

Browse files
authored
[maestrod] initial chart (#140)
> [!CAUTION] > Internal chart, only for Nutrient use. Initial state of `maestrod` chart.
1 parent 79799b5 commit c2a6353

30 files changed

Lines changed: 2256 additions & 7 deletions

.github/workflows/helm-docs.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,10 @@ jobs:
2727
chart-search-root: charts/ai-assistant
2828
# git-push: true
2929
fail-on-diff: true
30+
31+
- name: Run helm-docs for Maestrod
32+
uses: losisin/helm-docs-github-action@v1
33+
with:
34+
chart-search-root: charts/maestrod
35+
# git-push: true
36+
fail-on-diff: true

.github/workflows/lint-test.yaml

Lines changed: 54 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,18 +11,24 @@ on:
1111

1212
permissions:
1313
contents: read
14+
id-token: write # required for OIDC to assume the ECR-pull IAM role
1415

1516
jobs:
1617
lint-test:
1718
runs-on: ubuntu-latest
19+
env:
20+
MAESTROD_ECR_REGISTRY: 111300957880.dkr.ecr.eu-west-1.amazonaws.com
21+
MAESTROD_ECR_REPOSITORY: maestrod
22+
MAESTROD_ECR_TAG: nightly
23+
AWS_REGION: eu-west-1
1824
steps:
1925
- name: Checkout
2026
uses: actions/checkout@v6
2127
with:
2228
fetch-depth: 0
2329

2430
- name: Set up Helm
25-
uses: azure/setup-helm@v4
31+
uses: azure/setup-helm@v5
2632
with:
2733
version: latest
2834

@@ -41,6 +47,12 @@ jobs:
4147
if [[ -n "$changed" ]]; then
4248
echo "changed=true" >> "$GITHUB_OUTPUT"
4349
fi
50+
if echo "$changed" | grep -qx 'charts/maestrod'; then
51+
echo "maestrod-changed=true" >> "$GITHUB_OUTPUT"
52+
fi
53+
if echo "$changed" | grep -v '^charts/maestrod$' | grep -q .; then
54+
echo "non-maestrod-changed=true" >> "$GITHUB_OUTPUT"
55+
fi
4456
4557
- name: Run chart-testing (lint)
4658
if: steps.list-changed.outputs.changed == 'true'
@@ -50,16 +62,34 @@ jobs:
5062
if: steps.list-changed.outputs.changed == 'true'
5163
uses: helm/kind-action@v1
5264

65+
- name: Configure AWS credentials (for ECR pull)
66+
if: steps.list-changed.outputs.maestrod-changed == 'true'
67+
uses: aws-actions/configure-aws-credentials@v6
68+
with:
69+
role-to-assume: ${{ secrets.AWS_CI_ECR_ROLE_ARN }}
70+
aws-region: ${{ env.AWS_REGION }}
71+
72+
- name: Log in to Amazon ECR
73+
if: steps.list-changed.outputs.maestrod-changed == 'true'
74+
uses: aws-actions/amazon-ecr-login@v2
75+
76+
- name: Side-load maestrod image into kind
77+
if: steps.list-changed.outputs.maestrod-changed == 'true'
78+
run: |
79+
IMAGE="${MAESTROD_ECR_REGISTRY}/${MAESTROD_ECR_REPOSITORY}:${MAESTROD_ECR_TAG}"
80+
docker pull "$IMAGE"
81+
kind load docker-image "$IMAGE" --name chart-testing
82+
5383
- name: Install Gateway API CRDs
54-
if: steps.list-changed.outputs.changed == 'true'
84+
if: steps.list-changed.outputs.non-maestrod-changed == 'true'
5585
run: |
5686
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.5.0/standard-install.yaml
5787
kubectl wait --for=condition=Established crd/gatewayclasses.gateway.networking.k8s.io --timeout=120s
5888
kubectl wait --for=condition=Established crd/gateways.gateway.networking.k8s.io --timeout=120s
5989
kubectl wait --for=condition=Established crd/httproutes.gateway.networking.k8s.io --timeout=120s
6090
6191
- name: Install CloudNativePG
62-
if: steps.list-changed.outputs.changed == 'true'
92+
if: steps.list-changed.outputs.non-maestrod-changed == 'true'
6393
run: |
6494
helm repo add cnpg https://cloudnative-pg.github.io/charts
6595
helm upgrade --install cnpg \
@@ -84,7 +114,7 @@ jobs:
84114
--timeout=300s
85115
86116
- name: Install Garage
87-
if: steps.list-changed.outputs.changed == 'true'
117+
if: steps.list-changed.outputs.non-maestrod-changed == 'true'
88118
run: |
89119
kubectl create namespace whatever --dry-run=client -o yaml | kubectl apply -f -
90120
cat <<'EOF' | kubectl apply -f -
@@ -226,11 +256,29 @@ jobs:
226256
EOF
227257
kubectl wait --namespace whatever --for=condition=complete job/garage-create-buckets --timeout=300s
228258
229-
- name: Run chart-testing (install)
230-
if: steps.list-changed.outputs.changed == 'true'
259+
- name: Run chart-testing (install) — public-image charts
260+
if: steps.list-changed.outputs.non-maestrod-changed == 'true'
261+
# Public Nutrient charts (document-engine, ai-assistant, …): keep the
262+
# original `pullPolicy=Always` behaviour so the nightly tag is always
263+
# re-pulled from Docker Hub. Maestrod is excluded here and installed
264+
# separately below against its kind-loaded ECR image.
231265
run: |
232266
helm repo add nutrient https://pspdfkit.github.io/helm-charts
233267
ct install --target-branch ${{ github.event.repository.default_branch }} \
268+
--excluded-charts maestrod \
234269
--helm-extra-args "--timeout 300s" \
235270
--helm-extra-set-args "--set=image.tag=nightly" \
236271
--helm-extra-set-args "--set=image.pullPolicy=Always"
272+
273+
- name: Run chart-testing (install) — maestrod (ECR side-loaded)
274+
if: steps.list-changed.outputs.maestrod-changed == 'true'
275+
# Maestrod's image lives in a private ECR; the workflow pulls it on
276+
# the runner and side-loads it into the kind node above. We omit
277+
# `pullPolicy=Always` here so kubelet uses the loaded image
278+
# (the chart's `IfNotPresent` default) instead of trying to re-pull
279+
# from a registry kind has no credentials for.
280+
run: |
281+
ct install --target-branch ${{ github.event.repository.default_branch }} \
282+
--charts charts/maestrod \
283+
--helm-extra-args "--timeout 300s" \
284+
--helm-extra-set-args "--set=image.tag=${MAESTROD_ECR_TAG}"

CLAUDE.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,15 @@ Nutrient Helm Charts repository. Contains Kubernetes Helm charts for Nutrient pr
1515
|-------|-------------|
1616
| `document-engine` | Backend for document processing and automation workflows. Most complex chart. |
1717
| `ai-assistant` | AI Assistant application. Depends on `document-engine` chart. |
18+
| `maestrod` | Orchestration backend for Nutrient managed cloud workloads. Single stateless Deployment. |
1819
| `signing-service-example` | Example chart for demonstration. Excluded from CI. |
1920
| `simple-resource-wrapper` | Generic Kubernetes resource wrapper (Terraform workaround). |
2021

2122
## Code Generation — Do Not Edit Generated Files Directly
2223

2324
### README.md (helm-docs)
2425

25-
README.md files for `document-engine` and `ai-assistant` are **auto-generated** by
26+
README.md files for `document-engine`, `ai-assistant`, and `maestrod` are **auto-generated** by
2627
[helm-docs](https://github.com/norwoodj/helm-docs). CI fails if they are out of sync.
2728

2829
- **Template**: `charts/<chart>/README.md.gotmpl`
@@ -34,6 +35,7 @@ To regenerate locally:
3435
```bash
3536
helm-docs --chart-search-root charts/document-engine
3637
helm-docs --chart-search-root charts/ai-assistant
38+
helm-docs --chart-search-root charts/maestrod
3739
```
3840

3941
### values.schema.json (helm-values-schema-json)
@@ -49,6 +51,7 @@ To regenerate locally:
4951
```bash
5052
cd charts/document-engine && helm schema -input values.yaml -draft 2020 -indent 2 -output values.schema.json
5153
cd charts/ai-assistant && helm schema -input values.yaml -draft 2020 -indent 2 -output values.schema.json
54+
cd charts/maestrod && helm schema
5255
```
5356

5457
## values.yaml Comment Conventions
@@ -135,6 +138,7 @@ After modifying any chart, regenerate derived files before committing:
135138
```bash
136139
helm-docs --chart-search-root charts/document-engine
137140
helm-docs --chart-search-root charts/ai-assistant
141+
helm-docs --chart-search-root charts/maestrod
138142
```
139143
2. **values.schema.json** — run `helm schema` whenever `values.yaml` schema annotations change:
140144
```bash

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,14 @@ helm upgrade --install -n document-engine \
2121
-f ./document-engine-values.yaml
2222
```
2323

24+
### Maestrod
25+
26+
```
27+
helm upgrade --install -n maestrod \
28+
maestrod nutrient/maestrod \
29+
-f ./maestrod-values.yaml
30+
```
31+
2432
## Support, Issues and License Questions
2533

2634
Nutrient offers support via https://support.nutrient.io/hc/en-us/requests/new

charts/maestrod/.helmignore

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Patterns to ignore when building packages.
2+
# This supports shell glob matching, relative path matching, and
3+
# negation (prefixed with !). Only one pattern per line.
4+
.DS_Store
5+
# Common VCS dirs
6+
.git/
7+
.gitignore
8+
.bzr/
9+
.bzrignore
10+
.hg/
11+
.hgignore
12+
.svn/
13+
# Common backup files
14+
*.swp
15+
*.bak
16+
*.tmp
17+
*.orig
18+
*~
19+
# Various IDEs
20+
.project
21+
.idea/
22+
*.tmproj
23+
.vscode/

charts/maestrod/.schema.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
input:
2+
- values.yaml
3+
4+
draft: 2020
5+
indent: 2
6+
output: values.schema.json

charts/maestrod/CHANGELOG.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# Changelog
2+
3+
- [Changelog](#changelog)
4+
- [0.5.0 (2026-05-27)](#050-2026-05-27)
5+
- [Added](#added)
6+
7+
## 0.5.0 (2026-05-27)
8+
9+
First public release. Value-compatible with the internal `0.3.4` chart; the
10+
following defaults changed — set them explicitly to preserve old behaviour:
11+
12+
```yaml
13+
image:
14+
repository: <account>.dkr.ecr.eu-west-1.amazonaws.com/maestrod # now pspdfkit/maestrod
15+
tag: nightly # now empty (→ appVersion)
16+
pullPolicy: Always # now IfNotPresent
17+
imagePullSecrets: <...>
18+
podLabels: { component_name: maestrod } # now {}
19+
restartJob:
20+
registryAuthSecretName: "<...>" # now ""
21+
```
22+
23+
### Added
24+
25+
- `/health` HTTP defaults for `startupProbe` / `livenessProbe` / `readinessProbe`.
26+
- `NUTRIENT_SHOW_SCALAR` / `NATIVESDK_VISION_LOGS` via ConfigMap with
27+
`checksum/config` rollout trigger.
28+
- `serviceAccount`, `autoscaling`, `podDisruptionBudget`, `deploymentAnnotations`,
29+
`topologySpreadConstraints`, `schedulerName`, `lifecycle`, `extra*`,
30+
`sidecars`, `initContainers`.
31+
- `licenseSecret.name: ""` skips the `NUTRIENT_LICENSE_KEY` env var.
32+
- Generated `README.md` + `values.schema.json`; `ci/` values; `helm test` probe.

charts/maestrod/Chart.yaml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
apiVersion: v2
2+
name: maestrod
3+
type: application
4+
description: Maestrod, the orchestration backend for Nutrient managed cloud workloads.
5+
home: https://www.nutrient.io
6+
icon: https://cdn.prod.website-files.com/65fdb7696055f07a05048833/66e58e33c3880ff24aa34027_nutrient-logo.png
7+
version: 0.5.0
8+
appVersion: "v1.1.1"
9+
10+
keywords:
11+
- nutrient
12+
- maestrod
13+
14+
maintainers:
15+
- name: Nutrient
16+
email: support@nutrient.io
17+
url: https://www.nutrient.io

charts/maestrod/LICENSE

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
The Nutrient Sample applications are licensed with a modified BSD
2+
license. In plain language: you're allowed to do whatever you wish
3+
with the code, modify, redistribute, embed in your products (free or
4+
commercial), but you must include copyright, terms of usage and
5+
disclaimer as stated in the license.
6+
7+
You will require a commercial Nutrient License to run these examples
8+
in non-demo mode. Please refer to sales@nutrient.io for details.
9+
10+
Copyright © 2018-present PSPDFKit GmbH.
11+
All rights reserved.
12+
13+
Redistribution and use in source or binary forms,
14+
with or without modification, are permitted provided
15+
that the following conditions are met:
16+
17+
- Redistributions of source code must retain the above copyright
18+
notice, this list of conditions and the following disclaimer.
19+
20+
- Redistributions in binary form must reproduce the above copyright
21+
notice, this list of conditions and the following disclaimer in the
22+
documentation and/or other materials provided with the
23+
distribution.
24+
25+
- Redistributions of Nutrient Samples must include attribution to
26+
Nutrient, either in documentation or other appropriate media.
27+
28+
- Neither the name of the Nutrient, PSPDFKit GmbH, nor its developers
29+
may be used to endorse or promote products derived from
30+
this software without specific prior written permission.
31+
32+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
35+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
36+
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
37+
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
38+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
39+
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
40+
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
41+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
42+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

0 commit comments

Comments
 (0)