Publish new certification - cniackz/public GitHub Wiki

Publish New Certification - DirectPV Operator

Guía completa para publicar una nueva versión certificada del DirectPV Operator en Red Hat.


📋 Resumen del Proceso

El proceso completo consta de 12 fases divididas en dos partes:

Parte 1: Fases 1-8 (Automáticas via script)

✅ Ejecutadas por run-all-phases.shupdate-operator.sh

Parte 2: Fases 9-12 (Manuales)

⚠️ Requieren ejecución manual con comandos específicos


🚀 Ejecución Completa

PASO 1: Ejecutar Script Automático

# Ir al directorio de certificación
cd /Users/cniackz/minio/directpv/certification

# Ejecutar script que hace fases 1-8
./run-all-phases.sh

Qué hace este script:

Fase 1: Backup

# Crea backup timestamped
/Users/cniackz/Private-DPV-Operator-BACKUP-YYYYMMDD-HHMMSS

Fase 2: Update DirectPV Repo

cd /Users/cniackz/directpv
git fetch origin
git checkout master
git pull origin master

Fase 3: Update Helm Charts

# Copia charts 0.3.1 desde directpv repo
cd /Users/cniackz/Private-DPV-Operator
rm -rf helm-charts/aistor-volumemanager/*
cp -R /Users/cniackz/directpv/helm/aistor-volumemanager/* helm-charts/aistor-volumemanager/

Fase 4: Fix Memory Limits

Corrige memory limits en AMBOS archivos:

  • config/manager/manager.yaml → Manager: 1Gi/256Mi
  • config/default/manager_auth_proxy_patch.yaml → Proxy: 512Mi/128Mi

Fase 5: Update Makefile Version

# Actualiza VERSION en Makefile
VERSION ?= 5.0.1

Fase 6: Regenerate Bundle

make bundle

Input requerido:

Display name: directpv
Description: DirectPV CSI Driver for Kubernetes
Provider: MinIO
URL: https://min.io
Keywords: storage,csi,directpv
Maintainers: celis:[email protected]

Fase 7: Verify Bundle

Verifica que bundle/manifests/private-dpv-operator.clusterserviceversion.yaml tenga memory correcta.

Fase 8: Fix Bundle (si es necesario)

Auto-corrige CSV si memory está mal.

Resultado de Fases 1-8:

✅ Backup creado
✅ Charts actualizadas a 0.3.1
✅ Memory limits corregidos (1Gi/256Mi)
✅ Bundle regenerado
✅ CSV verificado

🛠️ PASO 2: Fases Manuales (9-12)

Fase 9: Compilar Operator Image

Directorio: /Users/cniackz/Private-DPV-Operator

# 1. Ir al directorio del operator
cd /Users/cniackz/Private-DPV-Operator

# 2. Verificar que estás en el directorio correcto
pwd
# Output esperado: /Users/cniackz/Private-DPV-Operator

# 3. Verificar la versión en Makefile
grep "^VERSION" Makefile
# Output esperado: VERSION ?= 5.0.1

# 4. Login a quay.io (si no estás logueado)
docker login quay.io
# Username: cniackz4
# Password: [tu password]

# 5. Build de la imagen (arquitectura x86)
make docker-build
# Este comando ejecuta:
#   docker buildx build --platform linux/amd64 -t quay.io/cniackz4/directpv-operator:5.0.1 .

# 6. Push de la imagen a quay.io
make docker-push
# Este comando ejecuta:
#   docker push quay.io/cniackz4/directpv-operator:5.0.1

# 7. Verificar que la imagen fue pusheada
docker images | grep directpv-operator

Duración: 30-40 minutos (dependiendo de tu conexión)

Output esperado:

[+] Building 1234.5s (12/12) FINISHED
 => [internal] load build definition from Dockerfile
 => => transferring dockerfile: 1.23kB
 ...
 => exporting to image
 => => pushing layers
 => => pushing manifest for quay.io/cniackz4/directpv-operator:5.0.1

Successfully built and pushed quay.io/cniackz4/directpv-operator:5.0.1

Fase 10: Compilar Bundle Image

Directorio: /Users/cniackz/Private-DPV-Operator

# 1. Asegúrate de estar en el directorio correcto
cd /Users/cniackz/Private-DPV-Operator

# 2. Verificar que bundle existe
ls -la bundle/
# Debe mostrar: manifests/ y metadata/

# 3. Build del bundle image
make bundle-build
# Este comando ejecuta:
#   docker build -f bundle.Dockerfile -t quay.io/cniackz4/directpv-operator-bundle:v5.0.1 .

# 4. Push del bundle image
make bundle-push
# Este comando ejecuta:
#   docker push quay.io/cniackz4/directpv-operator-bundle:v5.0.1

# 5. Verificar que el bundle fue pusheado
docker images | grep directpv-operator-bundle

Duración: 5-10 minutos

Output esperado:

Successfully built abc123def456
Successfully tagged quay.io/cniackz4/directpv-operator-bundle:v5.0.1
The push refers to repository [quay.io/cniackz4/directpv-operator-bundle]
...
v5.0.1: digest: sha256:abc123... size: 1234

Fase 11: Actualizar CSV con Digests

Directorio: /Users/cniackz/Private-DPV-Operator

# 1. Ir al directorio del operator
cd /Users/cniackz/Private-DPV-Operator

# 2. Obtener digest de operator image
OPERATOR_IMAGE="quay.io/cniackz4/directpv-operator:5.0.1"
OPERATOR_DIGEST=$(docker inspect --format='{{index .RepoDigests 0}}' $OPERATOR_IMAGE | cut -d'@' -f2)

echo "Operator digest: $OPERATOR_DIGEST"
# Output: sha256:abc123def456...

# 3. Obtener digest de bundle image
BUNDLE_IMAGE="quay.io/cniackz4/directpv-operator-bundle:v5.0.1"
BUNDLE_DIGEST=$(docker inspect --format='{{index .RepoDigests 0}}' $BUNDLE_IMAGE | cut -d'@' -f2)

echo "Bundle digest: $BUNDLE_DIGEST"
# Output: sha256:def456abc123...

# 4. Actualizar CSV con digest del operator
CSV_FILE="bundle/manifests/private-dpv-operator.clusterserviceversion.yaml"

# Backup del CSV original
cp "$CSV_FILE" "$CSV_FILE.backup"

# Reemplazar image con digest
sed -i '' "s|image: quay.io/cniackz4/directpv-operator:.*|image: quay.io/cniackz4/directpv-operator@$OPERATOR_DIGEST|g" "$CSV_FILE"

# 5. Verificar que el CSV fue actualizado
echo ""
echo "Verificando CSV actualizado:"
grep "image: quay.io/cniackz4/directpv-operator@" "$CSV_FILE"

# Output esperado:
#   image: quay.io/cniackz4/directpv-operator@sha256:abc123def456...

# 6. Rebuild bundle con digest actualizado
make bundle-build

# 7. Push del bundle actualizado
make bundle-push

Importante:

  • ✅ Las imágenes ahora usan digests (@sha256:...) en lugar de tags (:5.0.1)
  • ✅ Red Hat requiere digests para certificación
  • ✅ El CSV ahora tiene la referencia inmutable a la imagen

Fase 12: Crear PR en Certified Operators

Directorio: /Users/cniackz/certified-operators

# 1. Ir al directorio de certified-operators
cd /Users/cniackz/certified-operators

# 2. Verificar que estás en el directorio correcto
pwd
# Output esperado: /Users/cniackz/certified-operators

# 3. Verificar que tienes el upstream configurado
git remote -v
# Output esperado:
#   origin    [email protected]:cniackz/certified-operators.git (fetch)
#   upstream  [email protected]:redhat-openshift-ecosystem/certified-operators.git (fetch)

# 4. Actualizar fork desde upstream
git fetch upstream
git checkout main
git merge upstream/main
git push origin main

# 5. Crear variables para el PR
export OPERATOR_NAME="minio-volume-manager-operator"
export REDHAT_VERSION=$(date +"%Y.%-m.%d%H%M%S")
export BRANCH_NAME="$OPERATOR_NAME-$REDHAT_VERSION"
export REDHAT_PROJECT_ID="6866ea1357a2e3760f91f145"

echo "Red Hat version: $REDHAT_VERSION"
echo "Branch name: $BRANCH_NAME"

# 6. Crear branch
git checkout -b "$BRANCH_NAME"

# 7. Crear directorios para el nuevo bundle
mkdir -p "operators/$OPERATOR_NAME/$REDHAT_VERSION"

# 8. Copiar bundle desde Private-DPV-Operator
cp -R /Users/cniackz/Private-DPV-Operator/bundle/manifests "operators/$OPERATOR_NAME/$REDHAT_VERSION/"
cp -R /Users/cniackz/Private-DPV-Operator/bundle/metadata "operators/$OPERATOR_NAME/$REDHAT_VERSION/"

# 9. Crear ci.yaml con project ID
echo "cert_project_id: $REDHAT_PROJECT_ID" > "operators/$OPERATOR_NAME/ci.yaml"

# 10. Verificar estructura creada
tree "operators/$OPERATOR_NAME/$REDHAT_VERSION/" -L 2

# Output esperado:
# operators/minio-volume-manager-operator/2025.10.1234567/
# ├── manifests/
# │   ├── private-dpv-operator.clusterserviceversion.yaml
# │   └── ...
# └── metadata/
#     └── annotations.yaml

# 11. Git add
git add "operators/$OPERATOR_NAME/"

# 12. Ver cambios
git status --short

# 13. Crear commit
git commit -m "operator $OPERATOR_NAME ($REDHAT_VERSION)

Update to v5.0.1 with Helm charts 0.3.1

Changes:
- Update Helm charts to 0.3.1 (seccomp, hostNetwork support)
- Fix OOMKilled issue (memory: 1Gi/256Mi)
- Build for x86 (linux/amd64) architecture
- Use image digests
- Add Red Hat certification metadata

Version: $REDHAT_VERSION
Operator: $OPERATOR_NAME
Certification Project ID: $REDHAT_PROJECT_ID
Repository: https://github.com/cniackz/Private-DPV-Operator"

# 14. Push branch
git push --set-upstream origin "$BRANCH_NAME"

# 15. Crear PR usando gh CLI
gh pr create \
  --repo redhat-openshift-ecosystem/certified-operators \
  --base main \
  --head cniackz:$BRANCH_NAME \
  --title "operator $OPERATOR_NAME ($REDHAT_VERSION)" \
  --body "## Update to v5.0.1 with Helm charts 0.3.1

### Changes
- Update Helm charts to 0.3.1 (seccomp, hostNetwork support)
- Fix OOMKilled issue (memory: 1Gi/256Mi)
- Build for x86 (linux/amd64) architecture
- Use image digests
- Add Red Hat certification metadata

### Version Information
- **Operator Version:** 5.0.1
- **Chart Version:** 0.3.1
- **Red Hat Version:** $REDHAT_VERSION
- **Operator Name:** $OPERATOR_NAME
- **Certification Project ID:** $REDHAT_PROJECT_ID

### Repository
https://github.com/cniackz/Private-DPV-Operator

### Testing
- ✅ Tested locally with operator-sdk run bundle
- ✅ Memory limits verified: 1Gi/256Mi
- ✅ Image digests used
- ✅ Built for linux/amd64

/cc @redhat-openshift-ecosystem/certified-operators-reviewers"

Output esperado:

Creating pull request for cniackz:minio-volume-manager-operator-2025.10.1234567 into main in redhat-openshift-ecosystem/certified-operators

https://github.com/redhat-openshift-ecosystem/certified-operators/pull/XXXX

✅ Verificación Final

Checklist antes de crear PR:

# 1. Verificar que operator image tiene digest
cd /Users/cniackz/Private-DPV-Operator
grep "image: quay.io/cniackz4/directpv-operator@sha256:" bundle/manifests/private-dpv-operator.clusterserviceversion.yaml

# 2. Verificar memory limits en CSV
grep -A 4 "memory:" bundle/manifests/private-dpv-operator.clusterserviceversion.yaml | grep "1Gi"

# 3. Verificar que las imágenes están en quay.io
open "https://quay.io/repository/cniackz4/directpv-operator?tab=tags"
open "https://quay.io/repository/cniackz4/directpv-operator-bundle?tab=tags"

# 4. Verificar que el bundle es válido
operator-sdk bundle validate ./bundle

# Output esperado:
# INFO[0000] All validation tests have completed successfully

📊 Resultado Final

Después de completar todas las fases:

En Private-DPV-Operator:

  • ✅ Helm charts actualizados a 0.3.1
  • ✅ Memory limits corregidos (1Gi/256Mi)
  • ✅ Bundle regenerado con versión 5.0.1
  • ✅ CSV actualizado con image digests
  • ✅ Imágenes compiladas y pusheadas a quay.io

En certified-operators:

  • ✅ Branch creado: minio-volume-manager-operator-YYYY.M.DDHHMM SS
  • ✅ Bundle copiado a: operators/minio-volume-manager-operator/YYYY.M.DDHHMMSS/
  • ✅ ci.yaml creado con project ID
  • ✅ PR creado contra redhat-openshift-ecosystem/certified-operators

En Red Hat:

  • ⏳ Tests automáticos comenzarán en minutos:
    • File structure validation
    • Metadata validation
    • Image digest validation
    • DeployableByOLM test (30+ min)
    • CSI tests (requiere aprobación manual)

🐛 Troubleshooting Común

Error: "docker push denied"

# Solución: Login a quay.io
docker login quay.io

Error: "operator-sdk: command not found"

# Solución: El script descarga operator-sdk automáticamente
cd /Users/cniackz/Private-DPV-Operator
make bundle  # Esto descargará operator-sdk si no existe

Error: "gh: command not found"

# Solución: Instalar GitHub CLI
brew install gh
gh auth login

Error: "Memory limits still wrong in CSV"

# Solución: Ejecutar fix manual
cd /Users/cniackz/Private-DPV-Operator
./update-operator.sh --fix-only

Error: "Image not found in quay.io"

# Solución: Verificar que la imagen fue pusheada
docker images | grep directpv-operator
docker push quay.io/cniackz4/directpv-operator:5.0.1

📚 Referencias


📝 Notas Importantes

  1. Arquitectura: SIEMPRE compilar para linux/amd64 (x86), NO arm64
  2. Digests: SIEMPRE usar digests (@sha256:...) en lugar de tags
  3. Memory limits: Manager: 1Gi/256Mi, Proxy: 512Mi/128Mi
  4. Testing local: Probar con operator-sdk run bundle antes de crear PR
  5. Paciencia: Los tests de Red Hat pueden tomar 1-2 horas

Última actualización: 2 de Octubre, 2025 Versión del documento: 2.0 Autor: Cesar Celis Hernandez