Add ArgoCD PostSync hook for Harbor robot accounts
Manages robot accounts declaratively via GitOps: - tekton-builder: push/pull access for CI/CD pipelines - fastpass-cluster: pull-only access for K8s image pulls Implementation: - Kubernetes Job with argocd.argoproj.io/hook: PostSync annotation - Idempotent: checks if accounts exist before creating - Uses harbor-credentials ExternalSecret for admin password - BeforeHookCreation deletion policy for clean reruns Replaces manual robot account creation via Harbor API.
This commit is contained in:
87
cluster/platform/harbor/robot-accounts-sync.yaml
Normal file
87
cluster/platform/harbor/robot-accounts-sync.yaml
Normal file
@@ -0,0 +1,87 @@
|
||||
---
|
||||
apiVersion: batch/v1
|
||||
kind: Job
|
||||
metadata:
|
||||
name: harbor-robot-accounts-sync
|
||||
namespace: harbor
|
||||
annotations:
|
||||
argocd.argoproj.io/hook: PostSync
|
||||
argocd.argoproj.io/hook-delete-policy: BeforeHookCreation
|
||||
spec:
|
||||
template:
|
||||
metadata:
|
||||
name: harbor-robot-accounts-sync
|
||||
spec:
|
||||
restartPolicy: Never
|
||||
serviceAccountName: default
|
||||
containers:
|
||||
- name: sync-robot-accounts
|
||||
image: curlimages/curl:latest
|
||||
command:
|
||||
- /bin/sh
|
||||
- -c
|
||||
- |
|
||||
set -e
|
||||
|
||||
HARBOR_URL="https://the-seas.local.mk-labs.cloud/api/v2.0"
|
||||
ADMIN_USER="admin"
|
||||
ADMIN_PASSWORD="$(cat /secrets/admin-password)"
|
||||
|
||||
echo "Syncing Harbor robot accounts..."
|
||||
|
||||
# Function to check if robot account exists
|
||||
robot_exists() {
|
||||
local robot_name="$1"
|
||||
curl -k -s -u "${ADMIN_USER}:${ADMIN_PASSWORD}" \
|
||||
"${HARBOR_URL}/robots?q=name=${robot_name}" | grep -q "\"name\":\"robot\$${robot_name}\""
|
||||
}
|
||||
|
||||
# Function to create robot account
|
||||
create_robot() {
|
||||
local name="$1"
|
||||
local description="$2"
|
||||
local permissions="$3"
|
||||
|
||||
echo "Creating robot account: ${name}"
|
||||
curl -k -s -u "${ADMIN_USER}:${ADMIN_PASSWORD}" \
|
||||
-X POST "${HARBOR_URL}/robots" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "{
|
||||
\"name\": \"${name}\",
|
||||
\"description\": \"${description}\",
|
||||
\"duration\": -1,
|
||||
\"level\": \"system\",
|
||||
\"permissions\": ${permissions}
|
||||
}" || echo "Failed to create ${name}"
|
||||
}
|
||||
|
||||
# Tekton Builder - Push/Pull access
|
||||
if ! robot_exists "tekton-builder"; then
|
||||
create_robot "tekton-builder" \
|
||||
"Tekton CI/CD pipeline robot account with push/pull access" \
|
||||
'[{"kind":"project","namespace":"*","access":[{"resource":"repository","action":"push"},{"resource":"repository","action":"pull"},{"resource":"artifact","action":"read"},{"resource":"artifact","action":"list"}]}]'
|
||||
else
|
||||
echo "Robot account tekton-builder already exists"
|
||||
fi
|
||||
|
||||
# Fastpass Cluster - Pull-only access
|
||||
if ! robot_exists "fastpass-cluster"; then
|
||||
create_robot "fastpass-cluster" \
|
||||
"Fastpass Kubernetes cluster robot account with pull-only access" \
|
||||
'[{"kind":"project","namespace":"*","access":[{"resource":"repository","action":"pull"},{"resource":"artifact","action":"read"},{"resource":"artifact","action":"list"}]}]'
|
||||
else
|
||||
echo "Robot account fastpass-cluster already exists"
|
||||
fi
|
||||
|
||||
echo "Robot accounts sync complete"
|
||||
volumeMounts:
|
||||
- name: admin-credentials
|
||||
mountPath: /secrets
|
||||
readOnly: true
|
||||
volumes:
|
||||
- name: admin-credentials
|
||||
secret:
|
||||
secretName: harbor-credentials
|
||||
items:
|
||||
- key: HARBOR_ADMIN_PASSWORD
|
||||
path: admin-password
|
||||
Reference in New Issue
Block a user