## What this PR does
This PR splits the monolithic `cozystack-resource-definitions` package
into 25 individual resource definition packages (`*-rd`) for better
modularity and independent versioning.
**Changes:**
- Created 25 separate `*-rd` packages (bootbox-rd, bucket-rd,
clickhouse-rd, etcd-rd, ferretdb-rd, foundationdb-rd, http-cache-rd,
info-rd, ingress-rd, kafka-rd, kubernetes-rd, monitoring-rd, mysql-rd,
nats-rd, postgres-rd, rabbitmq-rd, redis-rd, seaweedfs-rd,
tcp-balancer-rd, tenant-rd, virtual-machine-rd, virtualprivatecloud-rd,
vm-disk-rd, vm-instance-rd, vpn-rd)
- Removed `packages/system/cozystack-resource-definitions`
- Updated platform bundles (paas-hosted, paas-full, distro-full) to
reference individual -rd packages
- Updated `hack/update-crd.sh` to use package-specific directories
Each `*-rd` package contains:
- `Chart.yaml` - package metadata
- `values.yaml` - default values
- `Makefile` - build instructions
- `cozyrds/<name>.yaml` - CRD definition
- `templates/cozyrd.yaml` - Helm template
**Benefits:**
- **Modularity**: Each resource definition is now a standalone package
- **Independent versioning**: Resources can be versioned independently
- **Maintainability**: Easier to update individual resources
- **Build efficiency**: Parallel building of resource packages
### Release note
```release-note
[platform] Split cozystack-resource-definitions into 25 separate *-rd packages for better modularity and independent versioning. Each resource definition is now a standalone package.
<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit
* **Refactor**
* Split the monolithic resource-definitions into many independent resource-definition packages (e.g., bootbox-rd, bucket-rd, clickhouse-rd, etc.) for modular deployment and finer-grained management
* Updated deployment bundles to reference the new per-resource releases with uniform cozy-system namespace and CRD dependency
* **Chores**
* Added packaging/Helm stubs (Chart.yaml, Makefile, values, templates) for each new resource-definition
* **Bug Fixes**
* Made CRD path resolution dynamic (NAME validated before assignment)
<sub>✏️ Tip: You can customize this high-level summary in your review settings.</sub>
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
140 lines
4 KiB
Bash
Executable file
140 lines
4 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
# Requirements: yq (v4), jq, base64
|
|
need() { command -v "$1" >/dev/null 2>&1 || { echo "need $1"; exit 1; }; }
|
|
need yq; need jq; need base64
|
|
|
|
CHART_YAML="${CHART_YAML:-Chart.yaml}"
|
|
VALUES_YAML="${VALUES_YAML:-values.yaml}"
|
|
SCHEMA_JSON="${SCHEMA_JSON:-values.schema.json}"
|
|
|
|
[[ -f "$CHART_YAML" ]] || { echo "No $CHART_YAML found"; exit 1; }
|
|
[[ -f "$SCHEMA_JSON" ]] || { echo "No $SCHEMA_JSON found"; exit 1; }
|
|
|
|
# Read basics from Chart.yaml
|
|
NAME="$(yq -r '.name // ""' "$CHART_YAML")"
|
|
DESC="$(yq -r '.description // ""' "$CHART_YAML")"
|
|
ICON_PATH_RAW="$(yq -r '.icon // ""' "$CHART_YAML")"
|
|
|
|
if [[ -z "$NAME" ]]; then
|
|
echo "Chart.yaml: .name is empty"; exit 1
|
|
fi
|
|
|
|
CRD_DIR="../../system/${NAME}-rd/cozyrds"
|
|
|
|
# Resolve icon path
|
|
# Accepts:
|
|
# /logos/foo.svg -> ./logos/foo.svg
|
|
# logos/foo.svg -> logos/foo.svg
|
|
# ./logos/foo.svg -> ./logos/foo.svg
|
|
# Fallback: ./logos/${NAME}.svg
|
|
resolve_icon_path() {
|
|
local p="$1"
|
|
if [[ -z "$p" || "$p" == "null" ]]; then
|
|
echo "./logos/${NAME}.svg"; return
|
|
fi
|
|
if [[ "$p" == /* ]]; then
|
|
echo ".${p}"
|
|
else
|
|
echo "$p"
|
|
fi
|
|
}
|
|
ICON_PATH="$(resolve_icon_path "$ICON_PATH_RAW")"
|
|
|
|
if [[ ! -f "$ICON_PATH" ]]; then
|
|
# try fallback
|
|
ALT="./logos/${NAME}.svg"
|
|
if [[ -f "$ALT" ]]; then
|
|
ICON_PATH="$ALT"
|
|
else
|
|
echo "Icon not found: $ICON_PATH"; exit 1
|
|
fi
|
|
fi
|
|
|
|
# Base64 (portable: no -w / -b options)
|
|
ICON_B64="$(base64 < "$ICON_PATH" | tr -d '\n' | tr -d '\r')"
|
|
|
|
# Decide which HelmRepository name to use based on path
|
|
# .../apps/... -> cozystack-apps
|
|
# .../extra/... -> cozystack-extra
|
|
# default: cozystack-apps
|
|
SOURCE_NAME="cozystack-apps"
|
|
case "$PWD" in
|
|
*"/apps/"*) SOURCE_NAME="cozystack-apps" ;;
|
|
*"/extra/"*) SOURCE_NAME="cozystack-extra" ;;
|
|
esac
|
|
|
|
# If file doesn't exist, create a minimal skeleton
|
|
OUT="${OUT:-$CRD_DIR/$NAME.yaml}"
|
|
if [[ ! -f "$OUT" ]]; then
|
|
cat >"$OUT" <<EOF
|
|
apiVersion: cozystack.io/v1alpha1
|
|
kind: CozystackResourceDefinition
|
|
metadata:
|
|
name: ${NAME}
|
|
spec: {}
|
|
EOF
|
|
fi
|
|
|
|
# Export vars for yq env()
|
|
export RES_NAME="$NAME"
|
|
export PREFIX="$NAME-"
|
|
if [ "$SOURCE_NAME" == "cozystack-extra" ]; then
|
|
export PREFIX=""
|
|
fi
|
|
export DESCRIPTION="$DESC"
|
|
export ICON_B64="$ICON_B64"
|
|
export SOURCE_NAME="$SOURCE_NAME"
|
|
export SCHEMA_JSON_MIN="$(jq -c . "$SCHEMA_JSON")"
|
|
|
|
# Generate keysOrder from values.yaml
|
|
export KEYS_ORDER="$(
|
|
yq -o=json '.' "$VALUES_YAML" | jq -c '
|
|
def get_paths_recursive(obj; path):
|
|
obj | to_entries | map(
|
|
.key as $key |
|
|
.value as $value |
|
|
if $value | type == "object" then
|
|
[path + [$key]] + get_paths_recursive($value; path + [$key])
|
|
else
|
|
[path + [$key]]
|
|
end
|
|
) | flatten(1)
|
|
;
|
|
(
|
|
[ ["apiVersion"], ["appVersion"], ["kind"], ["metadata"], ["metadata","name"] ]
|
|
)
|
|
+
|
|
(
|
|
get_paths_recursive(.; []) # get all paths in order
|
|
| map(select(length>0)) # drop root
|
|
| map(map(select(type != "number"))) # drop array indices
|
|
| map(["spec"] + .) # prepend "spec"
|
|
)
|
|
'
|
|
)"
|
|
|
|
# Update only necessary fields in-place
|
|
# - openAPISchema is loaded from file as a multi-line string (block scalar)
|
|
# - labels ensure cozystack.io/ui: "true"
|
|
# - prefix = "<name>-"
|
|
# - sourceRef derived from directory (apps|extra)
|
|
yq -i '
|
|
.apiVersion = (.apiVersion // "cozystack.io/v1alpha1") |
|
|
.kind = (.kind // "CozystackResourceDefinition") |
|
|
.metadata.name = strenv(RES_NAME) |
|
|
.spec.application.openAPISchema = strenv(SCHEMA_JSON_MIN) |
|
|
(.spec.application.openAPISchema style="literal") |
|
|
.spec.release.prefix = (strenv(PREFIX)) |
|
|
.spec.release.labels."cozystack.io/ui" = "true" |
|
|
.spec.release.chart.name = strenv(RES_NAME) |
|
|
.spec.release.chart.sourceRef.kind = "HelmRepository" |
|
|
.spec.release.chart.sourceRef.name = strenv(SOURCE_NAME) |
|
|
.spec.release.chart.sourceRef.namespace = "cozy-public" |
|
|
.spec.dashboard.description = strenv(DESCRIPTION) |
|
|
.spec.dashboard.icon = strenv(ICON_B64) |
|
|
.spec.dashboard.keysOrder = env(KEYS_ORDER)
|
|
' "$OUT"
|
|
|
|
echo "Updated $OUT"
|