From 3a8c5caeb5a3c6e30aaa72a72ce6b9fe615f6b99 Mon Sep 17 00:00:00 2001 From: aDisplayName Date: Mon, 19 Aug 2024 10:27:28 -0500 Subject: [PATCH 01/33] update release workflow (#1) * update release workflow * format --- .github/workflows/release.yml | 633 +++++++++++++++++----------------- .releaserc.json | 4 + 2 files changed, 323 insertions(+), 314 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 78dc6e54..b1edccba 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -8,8 +8,8 @@ concurrency: cancel-in-progress: false env: - COMMIT_NAME: Monkeynator - COMMIT_EMAIL: monkeynator@enix.io + COMMIT_NAME: aDisplayNam3 + COMMIT_EMAIL: mattali@gmail.com jobs: semver: @@ -36,7 +36,8 @@ jobs: with: dry_run: true env: - GITHUB_TOKEN: ${{ secrets.RELEASE_GITHUB_TOKEN }} + # GITHUB_TOKEN: ${{ secrets.RELEASE_GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Inspect semantic-release (dry-run) outcome shell: python @@ -120,10 +121,10 @@ jobs: runs-on: ubuntu-22.04 env: VERSION: ${{ github.run_id }} - HARBOR_URL: "harbor.enix.io" - HARBOR_REPO: "kube-image-keeper/kube-image-keeper" - GHCR_IMAGE: "ghcr.io/enix/kube-image-keeper" - QUAY_IMAGE: "quay.io/enix/kube-image-keeper" + # HARBOR_URL: "harbor.enix.io" + # HARBOR_REPO: "kube-image-keeper/kube-image-keeper" + GHCR_IMAGE: "ghcr.io/adisplayname/kube-image-keeper" + # QUAY_IMAGE: "quay.io/enix/kube-image-keeper" steps: - name: Checkout Repository uses: actions/checkout@v4 @@ -133,12 +134,12 @@ jobs: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - - name: Log in to the Container registry - uses: docker/login-action@v3 - with: - registry: ${{ env.HARBOR_URL }} - username: ${{ secrets.HARBOR_USERNAME }} - password: ${{ secrets.HARBOR_PASSWORD }} + # - name: Log in to the Container registry + # uses: docker/login-action@v3 + # with: + # registry: ${{ env.HARBOR_URL }} + # username: ${{ secrets.HARBOR_USERNAME }} + # password: ${{ secrets.HARBOR_PASSWORD }} - name: Generate image metadata id: meta @@ -147,7 +148,7 @@ jobs: images: | ${{ env.GHCR_IMAGE }} ${{ github.repository }} - ${{ env.QUAY_IMAGE }} + # ${{ env.QUAY_IMAGE }} - name: Build container images uses: docker/build-push-action@v6 @@ -160,7 +161,7 @@ jobs: push: true labels: ${{ steps.meta.outputs.labels }} tags: | - ${{ env.HARBOR_URL }}/${{ env.HARBOR_REPO }}:${{ env.VERSION }} + # ${{ env.HARBOR_URL }}/${{ env.HARBOR_REPO }}:${{ env.VERSION }} - name: Build alpine container images uses: docker/build-push-action@v6 @@ -174,284 +175,285 @@ jobs: push: true labels: ${{ steps.meta.outputs.labels }} tags: | - ${{ env.HARBOR_URL }}/${{ env.HARBOR_REPO }}:${{ env.VERSION }}-alpine - - e2e_install: - name: Tests e2e on K8s (Fresh install) - needs: - - build - runs-on: ubuntu-22.04 - env: - VERSION: ${{ github.run_id }} - HARBOR_IMAGE: "harbor.enix.io/kube-image-keeper/kube-image-keeper" - HARBOR_REGISTRY: "harbor.enix.io" - HARBOR_USERNAME: ${{ secrets.HARBOR_USERNAME }} - HARBOR_PASSWORD: ${{ secrets.HARBOR_PASSWORD }} - strategy: - max-parallel: 6 - matrix: - k8sversion: ["v1.24.17", "v1.25.16", "v1.26.14", "v1.27.11", "v1.28.7", "v1.29.2"] - steps: - - name: Checkout Repository - uses: actions/checkout@v4 - - - name: Setup KinD - uses: helm/kind-action@v1.10.0 - with: - node_image: kindest/node:${{ matrix.k8sversion }} - - - name: Run cert-manager installation - run: | - kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.11.0/cert-manager.yaml - kubectl wait pods -n cert-manager -l app.kubernetes.io/instance=cert-manager --for condition=Ready --timeout=90s - - - name: Set up chart-testing - uses: helm/chart-testing-action@v2.6.1 - - - name: Set up helm - uses: azure/setup-helm@v4 - with: - version: '3.9.0' - - - name: Run chart-testing (lint) - run: | - set -euo pipefail - ct lint \ - --charts helm/kube-image-keeper \ - --chart-repos bitnami=https://charts.bitnami.com/bitnami \ - --validate-maintainers=false --check-version-increment=false - - - name: Run helm (install) - run : | - set -euo pipefail - kubectl create namespace kuik-system - kubectl create secret docker-registry harbor-secret -n kuik-system --docker-server=${{ env.HARBOR_REGISTRY }} \ - --docker-username="$HARBOR_USERNAME" --docker-password="$HARBOR_PASSWORD" - helm upgrade --install kube-image-keeper -n kuik-system --create-namespace ./helm/kube-image-keeper \ - --set controllers.image.tag=$VERSION --set proxy.image.tag=$VERSION \ - --set controllers.image.repository=$HARBOR_IMAGE --set proxy.image.repository=$HARBOR_IMAGE \ - --set controllers.imagePullSecrets[0].name=harbor-secret --set proxy.image.imagePullSecrets[0].name=harbor-secret --debug - kubectl wait pods -n kuik-system -l app.kubernetes.io/instance=kube-image-keeper --for condition=Ready --timeout=90s - helm history kube-image-keeper -n kuik-system - - - name: Deploy test container - run: | - set -euo pipefail - kubectl create deploy nginx --image=nginx:stable-alpine --replicas=2 - kubectl rollout status deploy nginx - kubectl wait deployment nginx --for condition=Available=True --timeout=30s - echo "kubectl get cachedimage" - kubectl get cachedimages - echo "kubectl get repository" - kubectl get repository - - - name: Test cachedimage (CRD) - run: | - set -euo pipefail - ## Check if our test image is cached - if [ $(kubectl get cachedimages docker.io-library-nginx-stable-alpine -o json | jq ".status.isCached") ]; - then - if [ $(kubectl get cachedimages docker.io-library-nginx-stable-alpine -o json | jq ".status.usedBy.count") -eq 2 ]; - then - echo "Found cached image used by 2 pods" - else - echo "Error: pods count should be equal 2" - exit 1 - fi - else - echo "Error: image cached status is false" - exit 1 - fi - - - name: Test repository (CRD) - run: | - set -euo pipefail - ## Check repository status - if [ $(kubectl get repository docker.io-library-nginx -o json | jq '.status.phase') == '"Ready"' ] ; - then - echo "Found repository" - else - echo "Error: image repository status is not Ready" - exit 1 - fi - - - name: Test metrics endpoint - run: | - set -euo pipefail - ## Check for kuik's components metrics - for component in proxy controllers - do - echo "Testing $component metrics endpoint" - for ip in $(kubectl get po -l "app.kubernetes.io/component=$component" -n kuik-system -o jsonpath='{range .items[*]}{.status.podIP}{"\n"}{end}') - do - attempts=0 - success=false - while [[ $attempts -lt 3 && $success == false ]] - do - response=$(kubectl run curl-pod --image=curlimages/curl --rm -ti --quiet --restart=Never -- curl -s -o /dev/null -w "%{http_code}\n" http://$ip:8080/metrics) - if [[ -z "$response" ]]; then - echo "No HTTP response received from $ip" - elif [[ $response -ge 200 && $response -lt 300 ]]; then - echo "HTTP status code $response is valid for $ip" - success=true - else - echo "HTTP status code $response is not valid for $ip" - fi - attempts=$(( $attempts + 1 )) - sleep 3 - done - if [[ $success == false ]]; then - echo "Failed after 3 attempts for $ip" - exit 1 - fi - done - done - - e2e_upgrade: - name: Tests e2e on K8s (Upgrade) - needs: - - build - - e2e_install - runs-on: ubuntu-22.04 - env: - VERSION: ${{ github.run_id }} - HARBOR_IMAGE: "harbor.enix.io/kube-image-keeper/kube-image-keeper" - HARBOR_REGISTRY: "harbor.enix.io" - HARBOR_USERNAME: ${{ secrets.HARBOR_USERNAME }} - HARBOR_PASSWORD: ${{ secrets.HARBOR_PASSWORD }} - strategy: - max-parallel: 6 - matrix: - k8sversion: ["v1.24.17", "v1.25.16", "v1.26.14", "v1.27.11", "v1.28.7", "v1.29.2"] - steps: - - name: Checkout Repository - uses: actions/checkout@v4 - - - name: Setup KinD - uses: helm/kind-action@v1.10.0 - with: - node_image: kindest/node:${{ matrix.k8sversion }} - - - name: Run cert-manager installation - run: | - kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.11.0/cert-manager.yaml - kubectl wait pods -n cert-manager -l app.kubernetes.io/instance=cert-manager --for condition=Ready --timeout=30s - - - name: Set up chart-testing - uses: helm/chart-testing-action@v2.6.1 - - - name: Set up helm - uses: azure/setup-helm@v4 - with: - version: '3.9.0' - - - name: Run chart-testing (lint) - run: | - set -euo pipefail - ct lint \ - --charts helm/kube-image-keeper \ - --chart-repos bitnami=https://charts.bitnami.com/bitnami \ - --validate-maintainers=false --check-version-increment=false - - - name: Run helm (install latest release) - run : | - set -euo pipefail - helm repo add enix https://charts.enix.io/ - helm repo update - helm upgrade --install kube-image-keeper -n kuik-system --create-namespace enix/kube-image-keeper --debug - kubectl wait pods -n kuik-system -l app.kubernetes.io/instance=kube-image-keeper --for condition=Ready --timeout=30s - kubectl get po -n kuik-system - - - name: Run helm (upgrade) - run : | - set -euo pipefail - kubectl create secret docker-registry harbor-secret -n kuik-system --docker-server=${{ env.HARBOR_REGISTRY }} \ - --docker-username="$HARBOR_USERNAME" --docker-password="$HARBOR_PASSWORD" - helm upgrade --install kube-image-keeper -n kuik-system --create-namespace ./helm/kube-image-keeper \ - --set controllers.image.tag=$VERSION --set proxy.image.tag=$VERSION \ - --set controllers.image.repository=$HARBOR_IMAGE --set proxy.image.repository=$HARBOR_IMAGE \ - --set controllers.imagePullSecrets[0].name=harbor-secret --set proxy.image.imagePullSecrets[0].name=harbor-secret --wait --debug - kubectl rollout status deploy kube-image-keeper-controllers -n kuik-system - kubectl rollout status ds kube-image-keeper-proxy -n kuik-system - helm history kube-image-keeper -n kuik-system - - - name: Deploy test container - run: | - set -euo pipefail - kubectl create deploy nginx --image=nginx:stable-alpine --replicas=2 - kubectl rollout status deploy nginx - kubectl wait deployment nginx --for condition=Available=True --timeout=30s - echo "kubectl get cachedimage" - kubectl get cachedimages - echo "kubectl get repository" - kubectl get repository - - - name: Test cachedimage (CRD) - run: | - set -euo pipefail - ## Check if our test image is cached - if [ $(kubectl get cachedimages docker.io-library-nginx-stable-alpine -o json | jq ".status.isCached") ]; - then - if [ $(kubectl get cachedimages docker.io-library-nginx-stable-alpine -o json | jq ".status.usedBy.count") -eq 2 ]; - then - echo "Found cached image used by 2 pods" - else - echo "Error: pods count should be equal 2" - exit 1 - fi - else - echo "Error: image cached status is false" - exit 1 - fi - - - name: Test repository (CRD) - run: | - set -euo pipefail - ## Check repository status - if [ $(kubectl get repository docker.io-library-nginx -o json | jq '.status.phase') == '"Ready"' ] ; - then - echo "Found repository" - else - echo "Error: image repository status is not Ready" - exit 1 - fi - - - name: Test metrics endpoint - run: | - set -euo pipefail - ## Check for kuik's components metrics - for component in proxy controllers - do - echo "Testing $component metrics endpoint" - for ip in $(kubectl get po -l "app.kubernetes.io/component=$component" -n kuik-system -o jsonpath='{range .items[*]}{.status.podIP}{"\n"}{end}') - do - attempts=0 - success=false - while [[ $attempts -lt 3 && $success == false ]] - do - response=$(kubectl run curl-pod --image=curlimages/curl --rm -ti --quiet --restart=Never -- curl -s -o /dev/null -w "%{http_code}\n" http://$ip:8080/metrics) - if [[ -z "$response" ]]; then - echo "No HTTP response received from $ip" - elif [[ $response -ge 200 && $response -lt 300 ]]; then - echo "HTTP status code $response is valid for $ip" - success=true - else - echo "HTTP status code $response is not valid for $ip" - fi - attempts=$(( $attempts + 1 )) - sleep 3 - done - if [[ $success == false ]]; then - echo "Failed after 3 attempts for $ip" - exit 1 - fi - done - done + # ${{ env.HARBOR_URL }}/${{ env.HARBOR_REPO }}:${{ env.VERSION }}-alpine + + # e2e_install: + # name: Tests e2e on K8s (Fresh install) + # needs: + # - build + # runs-on: ubuntu-22.04 + # env: + # VERSION: ${{ github.run_id }} + # HARBOR_IMAGE: "harbor.enix.io/kube-image-keeper/kube-image-keeper" + # HARBOR_REGISTRY: "harbor.enix.io" + # HARBOR_USERNAME: ${{ secrets.HARBOR_USERNAME }} + # HARBOR_PASSWORD: ${{ secrets.HARBOR_PASSWORD }} + # strategy: + # max-parallel: 6 + # matrix: + # k8sversion: ["v1.24.17", "v1.25.16", "v1.26.14", "v1.27.11", "v1.28.7", "v1.29.2"] + # steps: + # - name: Checkout Repository + # uses: actions/checkout@v4 + + # - name: Setup KinD + # uses: helm/kind-action@v1.10.0 + # with: + # node_image: kindest/node:${{ matrix.k8sversion }} + + # - name: Run cert-manager installation + # run: | + # kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.11.0/cert-manager.yaml + # kubectl wait pods -n cert-manager -l app.kubernetes.io/instance=cert-manager --for condition=Ready --timeout=90s + + # - name: Set up chart-testing + # uses: helm/chart-testing-action@v2.6.1 + + # - name: Set up helm + # uses: azure/setup-helm@v4 + # with: + # version: '3.9.0' + + # - name: Run chart-testing (lint) + # run: | + # set -euo pipefail + # ct lint \ + # --charts helm/kube-image-keeper \ + # --chart-repos bitnami=https://charts.bitnami.com/bitnami \ + # --validate-maintainers=false --check-version-increment=false + + # - name: Run helm (install) + # run : | + # set -euo pipefail + # kubectl create namespace kuik-system + # kubectl create secret docker-registry harbor-secret -n kuik-system --docker-server=${{ env.HARBOR_REGISTRY }} \ + # --docker-username="$HARBOR_USERNAME" --docker-password="$HARBOR_PASSWORD" + # helm upgrade --install kube-image-keeper -n kuik-system --create-namespace ./helm/kube-image-keeper \ + # --set controllers.image.tag=$VERSION --set proxy.image.tag=$VERSION \ + # --set controllers.image.repository=$HARBOR_IMAGE --set proxy.image.repository=$HARBOR_IMAGE \ + # --set controllers.imagePullSecrets[0].name=harbor-secret --set proxy.image.imagePullSecrets[0].name=harbor-secret --debug + # kubectl wait pods -n kuik-system -l app.kubernetes.io/instance=kube-image-keeper --for condition=Ready --timeout=90s + # helm history kube-image-keeper -n kuik-system + + # - name: Deploy test container + # run: | + # set -euo pipefail + # kubectl create deploy nginx --image=nginx:stable-alpine --replicas=2 + # kubectl rollout status deploy nginx + # kubectl wait deployment nginx --for condition=Available=True --timeout=30s + # echo "kubectl get cachedimage" + # kubectl get cachedimages + # echo "kubectl get repository" + # kubectl get repository + + # - name: Test cachedimage (CRD) + # run: | + # set -euo pipefail + # ## Check if our test image is cached + # if [ $(kubectl get cachedimages docker.io-library-nginx-stable-alpine -o json | jq ".status.isCached") ]; + # then + # if [ $(kubectl get cachedimages docker.io-library-nginx-stable-alpine -o json | jq ".status.usedBy.count") -eq 2 ]; + # then + # echo "Found cached image used by 2 pods" + # else + # echo "Error: pods count should be equal 2" + # exit 1 + # fi + # else + # echo "Error: image cached status is false" + # exit 1 + # fi + + # - name: Test repository (CRD) + # run: | + # set -euo pipefail + # ## Check repository status + # if [ $(kubectl get repository docker.io-library-nginx -o json | jq '.status.phase') == '"Ready"' ] ; + # then + # echo "Found repository" + # else + # echo "Error: image repository status is not Ready" + # exit 1 + # fi + + # - name: Test metrics endpoint + # run: | + # set -euo pipefail + # ## Check for kuik's components metrics + # for component in proxy controllers + # do + # echo "Testing $component metrics endpoint" + # for ip in $(kubectl get po -l "app.kubernetes.io/component=$component" -n kuik-system -o jsonpath='{range .items[*]}{.status.podIP}{"\n"}{end}') + # do + # attempts=0 + # success=false + # while [[ $attempts -lt 3 && $success == false ]] + # do + # response=$(kubectl run curl-pod --image=curlimages/curl --rm -ti --quiet --restart=Never -- curl -s -o /dev/null -w "%{http_code}\n" http://$ip:8080/metrics) + # if [[ -z "$response" ]]; then + # echo "No HTTP response received from $ip" + # elif [[ $response -ge 200 && $response -lt 300 ]]; then + # echo "HTTP status code $response is valid for $ip" + # success=true + # else + # echo "HTTP status code $response is not valid for $ip" + # fi + # attempts=$(( $attempts + 1 )) + # sleep 3 + # done + # if [[ $success == false ]]; then + # echo "Failed after 3 attempts for $ip" + # exit 1 + # fi + # done + # done + + # e2e_upgrade: + # name: Tests e2e on K8s (Upgrade) + # needs: + # - build + # - e2e_install + # runs-on: ubuntu-22.04 + # env: + # VERSION: ${{ github.run_id }} + # HARBOR_IMAGE: "harbor.enix.io/kube-image-keeper/kube-image-keeper" + # HARBOR_REGISTRY: "harbor.enix.io" + # HARBOR_USERNAME: ${{ secrets.HARBOR_USERNAME }} + # HARBOR_PASSWORD: ${{ secrets.HARBOR_PASSWORD }} + # strategy: + # max-parallel: 6 + # matrix: + # k8sversion: ["v1.24.17", "v1.25.16", "v1.26.14", "v1.27.11", "v1.28.7", "v1.29.2"] + # steps: + # - name: Checkout Repository + # uses: actions/checkout@v4 + + # - name: Setup KinD + # uses: helm/kind-action@v1.10.0 + # with: + # node_image: kindest/node:${{ matrix.k8sversion }} + + # - name: Run cert-manager installation + # run: | + # kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.11.0/cert-manager.yaml + # kubectl wait pods -n cert-manager -l app.kubernetes.io/instance=cert-manager --for condition=Ready --timeout=30s + + # - name: Set up chart-testing + # uses: helm/chart-testing-action@v2.6.1 + + # - name: Set up helm + # uses: azure/setup-helm@v4 + # with: + # version: '3.9.0' + + # - name: Run chart-testing (lint) + # run: | + # set -euo pipefail + # ct lint \ + # --charts helm/kube-image-keeper \ + # --chart-repos bitnami=https://charts.bitnami.com/bitnami \ + # --validate-maintainers=false --check-version-increment=false + + # - name: Run helm (install latest release) + # run : | + # set -euo pipefail + # helm repo add enix https://charts.enix.io/ + # helm repo update + # helm upgrade --install kube-image-keeper -n kuik-system --create-namespace enix/kube-image-keeper --debug + # kubectl wait pods -n kuik-system -l app.kubernetes.io/instance=kube-image-keeper --for condition=Ready --timeout=30s + # kubectl get po -n kuik-system + + # - name: Run helm (upgrade) + # run : | + # set -euo pipefail + # kubectl create secret docker-registry harbor-secret -n kuik-system --docker-server=${{ env.HARBOR_REGISTRY }} \ + # --docker-username="$HARBOR_USERNAME" --docker-password="$HARBOR_PASSWORD" + # helm upgrade --install kube-image-keeper -n kuik-system --create-namespace ./helm/kube-image-keeper \ + # --set controllers.image.tag=$VERSION --set proxy.image.tag=$VERSION \ + # --set controllers.image.repository=$HARBOR_IMAGE --set proxy.image.repository=$HARBOR_IMAGE \ + # --set controllers.imagePullSecrets[0].name=harbor-secret --set proxy.image.imagePullSecrets[0].name=harbor-secret --wait --debug + # kubectl rollout status deploy kube-image-keeper-controllers -n kuik-system + # kubectl rollout status ds kube-image-keeper-proxy -n kuik-system + # helm history kube-image-keeper -n kuik-system + + # - name: Deploy test container + # run: | + # set -euo pipefail + # kubectl create deploy nginx --image=nginx:stable-alpine --replicas=2 + # kubectl rollout status deploy nginx + # kubectl wait deployment nginx --for condition=Available=True --timeout=30s + # echo "kubectl get cachedimage" + # kubectl get cachedimages + # echo "kubectl get repository" + # kubectl get repository + + # - name: Test cachedimage (CRD) + # run: | + # set -euo pipefail + # ## Check if our test image is cached + # if [ $(kubectl get cachedimages docker.io-library-nginx-stable-alpine -o json | jq ".status.isCached") ]; + # then + # if [ $(kubectl get cachedimages docker.io-library-nginx-stable-alpine -o json | jq ".status.usedBy.count") -eq 2 ]; + # then + # echo "Found cached image used by 2 pods" + # else + # echo "Error: pods count should be equal 2" + # exit 1 + # fi + # else + # echo "Error: image cached status is false" + # exit 1 + # fi + + # - name: Test repository (CRD) + # run: | + # set -euo pipefail + # ## Check repository status + # if [ $(kubectl get repository docker.io-library-nginx -o json | jq '.status.phase') == '"Ready"' ] ; + # then + # echo "Found repository" + # else + # echo "Error: image repository status is not Ready" + # exit 1 + # fi + + # - name: Test metrics endpoint + # run: | + # set -euo pipefail + # ## Check for kuik's components metrics + # for component in proxy controllers + # do + # echo "Testing $component metrics endpoint" + # for ip in $(kubectl get po -l "app.kubernetes.io/component=$component" -n kuik-system -o jsonpath='{range .items[*]}{.status.podIP}{"\n"}{end}') + # do + # attempts=0 + # success=false + # while [[ $attempts -lt 3 && $success == false ]] + # do + # response=$(kubectl run curl-pod --image=curlimages/curl --rm -ti --quiet --restart=Never -- curl -s -o /dev/null -w "%{http_code}\n" http://$ip:8080/metrics) + # if [[ -z "$response" ]]; then + # echo "No HTTP response received from $ip" + # elif [[ $response -ge 200 && $response -lt 300 ]]; then + # echo "HTTP status code $response is valid for $ip" + # success=true + # else + # echo "HTTP status code $response is not valid for $ip" + # fi + # attempts=$(( $attempts + 1 )) + # sleep 3 + # done + # if [[ $success == false ]]; then + # echo "Failed after 3 attempts for $ip" + # exit 1 + # fi + # done + # done release: name: Release needs: - - e2e_upgrade + # - e2e_upgrade + - build - semver runs-on: ubuntu-22.04 outputs: @@ -477,7 +479,8 @@ jobs: with: working_directory: repository env: - GITHUB_TOKEN: ${{ secrets.RELEASE_GITHUB_TOKEN }} + # GITHUB_TOKEN: ${{ secrets.RELEASE_GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GIT_COMMITTER_NAME: ${{ env.COMMIT_NAME }} GIT_COMMITTER_EMAIL: ${{ env.COMMIT_EMAIL }} GIT_AUTHOR_NAME: ${{ env.COMMIT_NAME }} @@ -540,8 +543,8 @@ jobs: CR_VERSION: "1.4.1" VERSION: ${{ needs.release.outputs.version }} PRERELEASE: ${{ needs.release.outputs.prerelease }} - QUAY_IMAGE: "quay.io/enix/kube-image-keeper" - GHCR_IMAGE: "ghcr.io/enix/kube-image-keeper" + # QUAY_IMAGE: "quay.io/enix/kube-image-keeper" + GHCR_IMAGE: "ghcr.io/adisplayname/kube-image-keeper" steps: - name: Configure git run: | @@ -596,25 +599,26 @@ jobs: URL='https://github.com/norwoodj/helm-docs/releases/download/v${{ env.HELM_DOCS_VERSION }}/helm-docs_${{ env.HELM_DOCS_VERSION }}_Linux_x86_64.tar.gz' curl -sSL "${URL}" | tar xz -C bin helm-docs - - name: Login to Docker Hub - uses: docker/login-action@v3 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} + # - name: Login to Docker Hub + # uses: docker/login-action@v3 + # with: + # username: ${{ secrets.DOCKERHUB_USERNAME }} + # password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Login to GHCR uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ env.COMMIT_NAME }} - password: ${{ secrets.RELEASE_GITHUB_TOKEN }} + # password: ${{ secrets.RELEASE_GITHUB_TOKEN }} + password: ${{ secrets.GITHUB_TOKEN }} - - name: Login to Quay.io - uses: docker/login-action@v3 - with: - registry: quay.io - username: ${{ secrets.QUAY_USERNAME }} - password: ${{ secrets.QUAY_ROBOT_TOKEN }} + # - name: Login to Quay.io + # uses: docker/login-action@v3 + # with: + # registry: quay.io + # username: ${{ secrets.QUAY_USERNAME }} + # password: ${{ secrets.QUAY_ROBOT_TOKEN }} - name: Generate image metadata id: meta @@ -622,8 +626,8 @@ jobs: with: images: | ${{ github.repository }} - ${{ env.QUAY_IMAGE }} ${{ env.GHCR_IMAGE }} + # ${{ env.QUAY_IMAGE }} - name: Build container images uses: docker/build-push-action@v6 @@ -637,8 +641,8 @@ jobs: labels: ${{ steps.meta.outputs.labels }} tags: | ${{ github.repository }}:${{ env.VERSION }} - ${{ env.QUAY_IMAGE }}:${{ env.VERSION }} ${{ env.GHCR_IMAGE }}:${{ env.VERSION }} + # ${{ env.QUAY_IMAGE }}:${{ env.VERSION }} - name: Push container images tag (Latest) uses: docker/build-push-action@v6 @@ -653,8 +657,8 @@ jobs: labels: ${{ steps.meta.outputs.labels }} tags: | ${{ github.repository }}:latest - ${{ env.QUAY_IMAGE }}:latest ${{ env.GHCR_IMAGE }}:latest + # ${{ env.QUAY_IMAGE }}:latest - name: Push container images tag (Release) uses: docker/build-push-action@v6 @@ -668,8 +672,8 @@ jobs: labels: ${{ steps.meta.outputs.labels }} tags: | ${{ github.repository }}:${{ env.VERSION }} - ${{ env.QUAY_IMAGE }}:${{ env.VERSION }} ${{ env.GHCR_IMAGE }}:${{ env.VERSION }} + # ${{ env.QUAY_IMAGE }}:${{ env.VERSION }} - name: Push alpine container images tag (Release) uses: docker/build-push-action@v6 @@ -684,8 +688,8 @@ jobs: labels: ${{ steps.meta.outputs.labels }} tags: | ${{ github.repository }}:${{ env.VERSION }}-alpine - ${{ env.QUAY_IMAGE }}:${{ env.VERSION }}-alpine ${{ env.GHCR_IMAGE }}:${{ env.VERSION }}-alpine + # ${{ env.QUAY_IMAGE }}:${{ env.VERSION }}-alpine - name: Convert Github changelog for Artifacthub shell: python @@ -800,7 +804,8 @@ jobs: PYTHONPATH: ${{ github.workspace }}/repository/.github HELM_DOCS_PATH: ${{ github.workspace }}/bin/helm-docs CR_PATH: ${{ github.workspace }}/bin/cr - CR_TOKEN: ${{ secrets.CHARTSREPO_GITHUB_TOKEN }} + # CR_TOKEN: ${{ secrets.CHARTSREPO_GITHUB_TOKEN }} + CR_TOKEN: ${{ secrets.GITHUB_TOKEN }} CHART_NAME: kube-image-keeper VERSION: ${{ needs.release.outputs.version }} PRERELEASE: ${{ needs.release.outputs.prerelease }} @@ -861,8 +866,8 @@ jobs: header('release the chart') action('clone helm charts repository') - charts_repo = os.path.join(os.environ['WORKSPACE'], 'enix-charts') - run('git', 'clone', 'https://github.com/enix/helm-charts', charts_repo) + charts_repo = os.path.join(os.environ['WORKSPACE'], 'adisplayname-charts') + run('git', 'clone', 'https://github.com/adisplayname/helm-charts', charts_repo) action('copy chart files') repo_chart_path = os.path.join(charts_repo, 'charts', os.environ['CHART_NAME']) @@ -872,10 +877,10 @@ jobs: run(os.environ['CR_PATH'], 'package', repo_chart_path, cwd=charts_repo) action('upload the chart') - run(os.environ['CR_PATH'], 'upload', '--skip-existing', '--owner', 'enix', '--git-repo', 'helm-charts', cwd=charts_repo) + run(os.environ['CR_PATH'], 'upload', '--skip-existing', '--owner', 'adisplayname', '--git-repo', 'helm-charts', cwd=charts_repo) action('update repository index') - run(os.environ['CR_PATH'], 'index', '--push', '-i', 'index.yaml', '--owner', 'enix', '--git-repo', 'helm-charts', cwd=charts_repo) + run(os.environ['CR_PATH'], 'index', '--push', '-i', 'index.yaml', '--owner', 'adisplayname', '--git-repo', 'helm-charts', cwd=charts_repo) cleanup: name: Cleanup diff --git a/.releaserc.json b/.releaserc.json index c22c68d1..0de0a73d 100644 --- a/.releaserc.json +++ b/.releaserc.json @@ -23,6 +23,10 @@ "name": "main", "prerelease": "beta" }, + { + "name": "develop", + "prerelease": "alpha" + }, { "name": "release" } From 495456b7641c51aa8939c35d3f0b49b68d665694 Mon Sep 17 00:00:00 2001 From: aDisplayName Date: Mon, 19 Aug 2024 10:36:30 -0500 Subject: [PATCH 02/33] fix: remove build test image step --- .github/workflows/release.yml | 120 +++++++++++++++++----------------- 1 file changed, 60 insertions(+), 60 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b1edccba..d9878445 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -113,69 +113,69 @@ jobs: --chart-repos bitnami=https://charts.bitnami.com/bitnami \ --validate-maintainers=false --check-version-increment=false - build: - name: Build test image - needs: - - semver - - tests - runs-on: ubuntu-22.04 - env: - VERSION: ${{ github.run_id }} - # HARBOR_URL: "harbor.enix.io" - # HARBOR_REPO: "kube-image-keeper/kube-image-keeper" - GHCR_IMAGE: "ghcr.io/adisplayname/kube-image-keeper" - # QUAY_IMAGE: "quay.io/enix/kube-image-keeper" - steps: - - name: Checkout Repository - uses: actions/checkout@v4 - with: - path: repository + # build: + # name: Build test image + # needs: + # - semver + # - tests + # runs-on: ubuntu-22.04 + # env: + # VERSION: ${{ github.run_id }} + # # HARBOR_URL: "harbor.enix.io" + # # HARBOR_REPO: "kube-image-keeper/kube-image-keeper" + # GHCR_IMAGE: "ghcr.io/adisplayname/kube-image-keeper" + # # QUAY_IMAGE: "quay.io/enix/kube-image-keeper" + # steps: + # - name: Checkout Repository + # uses: actions/checkout@v4 + # with: + # path: repository - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 + # - name: Set up Docker Buildx + # uses: docker/setup-buildx-action@v3 - # - name: Log in to the Container registry - # uses: docker/login-action@v3 - # with: - # registry: ${{ env.HARBOR_URL }} - # username: ${{ secrets.HARBOR_USERNAME }} - # password: ${{ secrets.HARBOR_PASSWORD }} + # # - name: Log in to the Container registry + # # uses: docker/login-action@v3 + # # with: + # # registry: ${{ env.HARBOR_URL }} + # # username: ${{ secrets.HARBOR_USERNAME }} + # # password: ${{ secrets.HARBOR_PASSWORD }} - - name: Generate image metadata - id: meta - uses: docker/metadata-action@v5 - with: - images: | - ${{ env.GHCR_IMAGE }} - ${{ github.repository }} - # ${{ env.QUAY_IMAGE }} - - - name: Build container images - uses: docker/build-push-action@v6 - with: - context: repository - platforms: linux/amd64,linux/arm64 - build-args: | - "VERSION=${{ env.VERSION }}" - "REVISION=${{ github.sha }}" - push: true - labels: ${{ steps.meta.outputs.labels }} - tags: | - # ${{ env.HARBOR_URL }}/${{ env.HARBOR_REPO }}:${{ env.VERSION }} + # - name: Generate image metadata + # id: meta + # uses: docker/metadata-action@v5 + # with: + # images: | + # ${{ env.GHCR_IMAGE }} + # ${{ github.repository }} + # # ${{ env.QUAY_IMAGE }} - - name: Build alpine container images - uses: docker/build-push-action@v6 - with: - context: repository - platforms: linux/amd64,linux/arm64 - build-args: | - "VERSION=${{ env.VERSION }}" - "REVISION=${{ github.sha }}" - target: alpine - push: true - labels: ${{ steps.meta.outputs.labels }} - tags: | - # ${{ env.HARBOR_URL }}/${{ env.HARBOR_REPO }}:${{ env.VERSION }}-alpine + # - name: Build container images + # uses: docker/build-push-action@v6 + # with: + # context: repository + # platforms: linux/amd64,linux/arm64 + # build-args: | + # "VERSION=${{ env.VERSION }}" + # "REVISION=${{ github.sha }}" + # push: true + # labels: ${{ steps.meta.outputs.labels }} + # tags: | + # # ${{ env.HARBOR_URL }}/${{ env.HARBOR_REPO }}:${{ env.VERSION }} + + # - name: Build alpine container images + # uses: docker/build-push-action@v6 + # with: + # context: repository + # platforms: linux/amd64,linux/arm64 + # build-args: | + # "VERSION=${{ env.VERSION }}" + # "REVISION=${{ github.sha }}" + # target: alpine + # push: true + # labels: ${{ steps.meta.outputs.labels }} + # tags: | + # # ${{ env.HARBOR_URL }}/${{ env.HARBOR_REPO }}:${{ env.VERSION }}-alpine # e2e_install: # name: Tests e2e on K8s (Fresh install) @@ -453,7 +453,7 @@ jobs: name: Release needs: # - e2e_upgrade - - build + - tests - semver runs-on: ubuntu-22.04 outputs: From f0f3599d60fab5422cf7dd8620582d7e087a2d46 Mon Sep 17 00:00:00 2001 From: aDisplayName Date: Mon, 19 Aug 2024 11:25:14 -0500 Subject: [PATCH 03/33] fix: Disable docker hub image tagging --- .github/workflows/release.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d9878445..fe16851f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -147,7 +147,7 @@ jobs: # with: # images: | # ${{ env.GHCR_IMAGE }} - # ${{ github.repository }} + # # ${{ github.repository }} # # ${{ env.QUAY_IMAGE }} # - name: Build container images @@ -625,8 +625,8 @@ jobs: uses: docker/metadata-action@v5 with: images: | - ${{ github.repository }} ${{ env.GHCR_IMAGE }} + # ${{ github.repository }} # ${{ env.QUAY_IMAGE }} - name: Build container images @@ -640,8 +640,8 @@ jobs: push: false labels: ${{ steps.meta.outputs.labels }} tags: | - ${{ github.repository }}:${{ env.VERSION }} ${{ env.GHCR_IMAGE }}:${{ env.VERSION }} + # ${{ github.repository }}:${{ env.VERSION }} # ${{ env.QUAY_IMAGE }}:${{ env.VERSION }} - name: Push container images tag (Latest) @@ -656,8 +656,8 @@ jobs: push: true labels: ${{ steps.meta.outputs.labels }} tags: | - ${{ github.repository }}:latest ${{ env.GHCR_IMAGE }}:latest + # ${{ github.repository }}:latest # ${{ env.QUAY_IMAGE }}:latest - name: Push container images tag (Release) @@ -671,8 +671,8 @@ jobs: push: true labels: ${{ steps.meta.outputs.labels }} tags: | - ${{ github.repository }}:${{ env.VERSION }} ${{ env.GHCR_IMAGE }}:${{ env.VERSION }} + # ${{ github.repository }}:${{ env.VERSION }} # ${{ env.QUAY_IMAGE }}:${{ env.VERSION }} - name: Push alpine container images tag (Release) @@ -687,8 +687,8 @@ jobs: push: true labels: ${{ steps.meta.outputs.labels }} tags: | - ${{ github.repository }}:${{ env.VERSION }}-alpine ${{ env.GHCR_IMAGE }}:${{ env.VERSION }}-alpine + # ${{ github.repository }}:${{ env.VERSION }}-alpine # ${{ env.QUAY_IMAGE }}:${{ env.VERSION }}-alpine - name: Convert Github changelog for Artifacthub From c0db58de16ec68dc82fe37ced09f39b8232d8ccb Mon Sep 17 00:00:00 2001 From: aDisplayName Date: Mon, 19 Aug 2024 13:56:18 -0500 Subject: [PATCH 04/33] fix: use a different secret to access helm-charts repo for upload --- .github/workflows/release.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fe16851f..82c97881 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -804,8 +804,7 @@ jobs: PYTHONPATH: ${{ github.workspace }}/repository/.github HELM_DOCS_PATH: ${{ github.workspace }}/bin/helm-docs CR_PATH: ${{ github.workspace }}/bin/cr - # CR_TOKEN: ${{ secrets.CHARTSREPO_GITHUB_TOKEN }} - CR_TOKEN: ${{ secrets.GITHUB_TOKEN }} + CR_TOKEN: ${{ secrets.CHARTSREPO_GITHUB_TOKEN }} CHART_NAME: kube-image-keeper VERSION: ${{ needs.release.outputs.version }} PRERELEASE: ${{ needs.release.outputs.prerelease }} From a33f916b4b96b5d90129d4d8a341a32f1b372c54 Mon Sep 17 00:00:00 2001 From: aDisplayName Date: Mon, 19 Aug 2024 14:49:24 -0500 Subject: [PATCH 05/33] fix: move helm chart image index file to `charts` folder --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 82c97881..b3a97784 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -879,7 +879,7 @@ jobs: run(os.environ['CR_PATH'], 'upload', '--skip-existing', '--owner', 'adisplayname', '--git-repo', 'helm-charts', cwd=charts_repo) action('update repository index') - run(os.environ['CR_PATH'], 'index', '--push', '-i', 'index.yaml', '--owner', 'adisplayname', '--git-repo', 'helm-charts', cwd=charts_repo) + run(os.environ['CR_PATH'], 'index', '--push', '-i', 'index.yaml', '--owner', 'adisplayname', '--git-repo', 'helm-charts', '--pages-index-path','charts', cwd=charts_repo) cleanup: name: Cleanup From c3d883ee553b573dcece90e1146e1fbd803fa285 Mon Sep 17 00:00:00 2001 From: aDisplayName Date: Tue, 20 Aug 2024 10:55:54 -0500 Subject: [PATCH 06/33] Pr/develop/add progress in cached image crd (#2) * Add progress porperty in CachedImage CRD Status * Update go package name --- api/core/v1/pod_webhook.go | 4 ++-- api/core/v1/pod_webhook_test.go | 4 ++-- .../cachedimage_types.go | 9 ++++++++- .../cachedimage_utils.go | 4 ++-- .../cachedimage_webhook.go | 4 ++-- .../cachedimage_webhook_test.go | 2 +- .../groupversion_info.go | 6 +++--- .../repository_types.go | 2 +- .../repository_utils.go | 4 ++-- cmd/cache/main.go | 16 ++++++++-------- cmd/proxy/main.go | 8 ++++---- config/crd/bases/kuik.enix.io_cachedimages.yaml | 11 ++++++++++- go.mod | 2 +- helm/kube-image-keeper/crds/cachedimage-crd.yaml | 14 +++++++++++++- internal/controller/collector.go | 4 ++-- internal/controller/core/pod_controller.go | 4 ++-- internal/controller/core/pod_controller_test.go | 4 ++-- internal/controller/core/suite_test.go | 2 +- .../controller/kuik/cachedimage_controller.go | 8 ++++---- .../kuik/cachedimage_controller_test.go | 2 +- .../controller/kuik/repository_controller.go | 6 +++--- internal/controller/kuik/suite_test.go | 4 ++-- internal/proxy/collector.go | 2 +- internal/proxy/server.go | 6 +++--- internal/scheme/scheme.go | 2 +- 25 files changed, 81 insertions(+), 53 deletions(-) rename api/kuik/{v1alpha1 => v1alpha1ext1}/cachedimage_types.go (93%) rename api/kuik/{v1alpha1 => v1alpha1ext1}/cachedimage_utils.go (91%) rename api/kuik/{v1alpha1 => v1alpha1ext1}/cachedimage_webhook.go (92%) rename api/kuik/{v1alpha1 => v1alpha1ext1}/cachedimage_webhook_test.go (98%) rename api/kuik/{v1alpha1 => v1alpha1ext1}/groupversion_info.go (79%) rename api/kuik/{v1alpha1 => v1alpha1ext1}/repository_types.go (98%) rename api/kuik/{v1alpha1 => v1alpha1ext1}/repository_utils.go (88%) diff --git a/api/core/v1/pod_webhook.go b/api/core/v1/pod_webhook.go index 9a3ae133..034ea81c 100644 --- a/api/core/v1/pod_webhook.go +++ b/api/core/v1/pod_webhook.go @@ -11,8 +11,8 @@ import ( _ "crypto/sha256" - "github.com/enix/kube-image-keeper/internal/controller/core" - "github.com/enix/kube-image-keeper/internal/registry" + "github.com/adisplayname/kube-image-keeper/internal/controller/core" + "github.com/adisplayname/kube-image-keeper/internal/registry" "github.com/google/go-containerregistry/pkg/name" admissionv1 "k8s.io/api/admission/v1" corev1 "k8s.io/api/core/v1" diff --git a/api/core/v1/pod_webhook_test.go b/api/core/v1/pod_webhook_test.go index a058d18b..376f6b2b 100644 --- a/api/core/v1/pod_webhook_test.go +++ b/api/core/v1/pod_webhook_test.go @@ -6,8 +6,8 @@ import ( "regexp" "testing" - "github.com/enix/kube-image-keeper/internal/controller/core" - "github.com/enix/kube-image-keeper/internal/registry" + "github.com/adisplayname/kube-image-keeper/internal/controller/core" + "github.com/adisplayname/kube-image-keeper/internal/registry" . "github.com/onsi/gomega" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" diff --git a/api/kuik/v1alpha1/cachedimage_types.go b/api/kuik/v1alpha1ext1/cachedimage_types.go similarity index 93% rename from api/kuik/v1alpha1/cachedimage_types.go rename to api/kuik/v1alpha1ext1/cachedimage_types.go index 9ddf41ef..5ef16b46 100644 --- a/api/kuik/v1alpha1/cachedimage_types.go +++ b/api/kuik/v1alpha1ext1/cachedimage_types.go @@ -1,4 +1,4 @@ -package v1alpha1 +package v1alpha1ext1 import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -26,12 +26,19 @@ type UsedBy struct { Count int `json:"count,omitempty"` } +type Progress struct { + Total int64 `json:"total,omitempty"` + Available int64 `json:"available,omitempty"` +} + // CachedImageStatus defines the observed state of CachedImage type CachedImageStatus struct { IsCached bool `json:"isCached,omitempty"` Phase string `json:"phase,omitempty"` UsedBy UsedBy `json:"usedBy,omitempty"` + Progress Progress `json:"progress,omitempty"` + Digest string `json:"digest,omitempty"` UpstreamDigest string `json:"upstreamDigest,omitempty"` UpToDate bool `json:"upToDate,omitempty"` diff --git a/api/kuik/v1alpha1/cachedimage_utils.go b/api/kuik/v1alpha1ext1/cachedimage_utils.go similarity index 91% rename from api/kuik/v1alpha1/cachedimage_utils.go rename to api/kuik/v1alpha1ext1/cachedimage_utils.go index cd37905b..9cd13951 100644 --- a/api/kuik/v1alpha1/cachedimage_utils.go +++ b/api/kuik/v1alpha1ext1/cachedimage_utils.go @@ -1,10 +1,10 @@ -package v1alpha1 +package v1alpha1ext1 import ( "context" + "github.com/adisplayname/kube-image-keeper/internal/registry" "github.com/distribution/reference" - "github.com/enix/kube-image-keeper/internal/registry" corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/types" diff --git a/api/kuik/v1alpha1/cachedimage_webhook.go b/api/kuik/v1alpha1ext1/cachedimage_webhook.go similarity index 92% rename from api/kuik/v1alpha1/cachedimage_webhook.go rename to api/kuik/v1alpha1ext1/cachedimage_webhook.go index baa98b58..1f5590b9 100644 --- a/api/kuik/v1alpha1/cachedimage_webhook.go +++ b/api/kuik/v1alpha1ext1/cachedimage_webhook.go @@ -1,10 +1,10 @@ -package v1alpha1 +package v1alpha1ext1 import ( "context" + "github.com/adisplayname/kube-image-keeper/internal/registry" "github.com/distribution/reference" - "github.com/enix/kube-image-keeper/internal/registry" runtime "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" ctrl "sigs.k8s.io/controller-runtime" diff --git a/api/kuik/v1alpha1/cachedimage_webhook_test.go b/api/kuik/v1alpha1ext1/cachedimage_webhook_test.go similarity index 98% rename from api/kuik/v1alpha1/cachedimage_webhook_test.go rename to api/kuik/v1alpha1ext1/cachedimage_webhook_test.go index dc061f72..7dc48f84 100644 --- a/api/kuik/v1alpha1/cachedimage_webhook_test.go +++ b/api/kuik/v1alpha1ext1/cachedimage_webhook_test.go @@ -1,4 +1,4 @@ -package v1alpha1 +package v1alpha1ext1 import ( "context" diff --git a/api/kuik/v1alpha1/groupversion_info.go b/api/kuik/v1alpha1ext1/groupversion_info.go similarity index 79% rename from api/kuik/v1alpha1/groupversion_info.go rename to api/kuik/v1alpha1ext1/groupversion_info.go index 634c4880..8ea706eb 100644 --- a/api/kuik/v1alpha1/groupversion_info.go +++ b/api/kuik/v1alpha1ext1/groupversion_info.go @@ -1,7 +1,7 @@ -// Package v1alpha1 contains API Schema definitions for the kuik.enix.io v1alpha1 API group +// Package v1alpha1ext1 contains API Schema definitions for the kuik.enix.io v1alpha1ext1 API group // +kubebuilder:object:generate=true // +groupName=kuik.enix.io -package v1alpha1 +package v1alpha1ext1 import ( "k8s.io/apimachinery/pkg/runtime/schema" @@ -10,7 +10,7 @@ import ( var ( // GroupVersion is group version used to register these objects - GroupVersion = schema.GroupVersion{Group: "kuik.enix.io", Version: "v1alpha1"} + GroupVersion = schema.GroupVersion{Group: "kuik.enix.io", Version: "v1alpha1ext1"} // SchemeBuilder is used to add go types to the GroupVersionKind scheme SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion} diff --git a/api/kuik/v1alpha1/repository_types.go b/api/kuik/v1alpha1ext1/repository_types.go similarity index 98% rename from api/kuik/v1alpha1/repository_types.go rename to api/kuik/v1alpha1ext1/repository_types.go index 7b4528a1..8f0606db 100644 --- a/api/kuik/v1alpha1/repository_types.go +++ b/api/kuik/v1alpha1ext1/repository_types.go @@ -1,4 +1,4 @@ -package v1alpha1 +package v1alpha1ext1 import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" diff --git a/api/kuik/v1alpha1/repository_utils.go b/api/kuik/v1alpha1ext1/repository_utils.go similarity index 88% rename from api/kuik/v1alpha1/repository_utils.go rename to api/kuik/v1alpha1ext1/repository_utils.go index a057cc57..14a142eb 100644 --- a/api/kuik/v1alpha1/repository_utils.go +++ b/api/kuik/v1alpha1ext1/repository_utils.go @@ -1,9 +1,9 @@ -package v1alpha1 +package v1alpha1ext1 import ( "regexp" - "github.com/enix/kube-image-keeper/internal/registry" + "github.com/adisplayname/kube-image-keeper/internal/registry" corev1 "k8s.io/api/core/v1" "sigs.k8s.io/controller-runtime/pkg/client" ) diff --git a/cmd/cache/main.go b/cmd/cache/main.go index 2140bef6..fc046521 100644 --- a/cmd/cache/main.go +++ b/cmd/cache/main.go @@ -17,14 +17,14 @@ import ( "sigs.k8s.io/controller-runtime/pkg/webhook" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" - kuikenixiov1 "github.com/enix/kube-image-keeper/api/core/v1" - kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1" - "github.com/enix/kube-image-keeper/internal" - kuikController "github.com/enix/kube-image-keeper/internal/controller" - "github.com/enix/kube-image-keeper/internal/controller/core" - "github.com/enix/kube-image-keeper/internal/controller/kuik" - "github.com/enix/kube-image-keeper/internal/registry" - "github.com/enix/kube-image-keeper/internal/scheme" + kuikenixiov1 "github.com/adisplayname/kube-image-keeper/api/core/v1" + kuikv1alpha1 "github.com/adisplayname/kube-image-keeper/api/kuik/v1alpha1ext1" + "github.com/adisplayname/kube-image-keeper/internal" + kuikController "github.com/adisplayname/kube-image-keeper/internal/controller" + "github.com/adisplayname/kube-image-keeper/internal/controller/core" + "github.com/adisplayname/kube-image-keeper/internal/controller/kuik" + "github.com/adisplayname/kube-image-keeper/internal/registry" + "github.com/adisplayname/kube-image-keeper/internal/scheme" //+kubebuilder:scaffold:imports ) diff --git a/cmd/proxy/main.go b/cmd/proxy/main.go index 7652bb28..71f76436 100644 --- a/cmd/proxy/main.go +++ b/cmd/proxy/main.go @@ -7,10 +7,10 @@ import ( _ "go.uber.org/automaxprocs" - "github.com/enix/kube-image-keeper/internal" - "github.com/enix/kube-image-keeper/internal/proxy" - "github.com/enix/kube-image-keeper/internal/registry" - "github.com/enix/kube-image-keeper/internal/scheme" + "github.com/adisplayname/kube-image-keeper/internal" + "github.com/adisplayname/kube-image-keeper/internal/proxy" + "github.com/adisplayname/kube-image-keeper/internal/registry" + "github.com/adisplayname/kube-image-keeper/internal/scheme" "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/util/flowcontrol" diff --git a/config/crd/bases/kuik.enix.io_cachedimages.yaml b/config/crd/bases/kuik.enix.io_cachedimages.yaml index efbe1f37..1f2c33cd 100644 --- a/config/crd/bases/kuik.enix.io_cachedimages.yaml +++ b/config/crd/bases/kuik.enix.io_cachedimages.yaml @@ -35,7 +35,7 @@ spec: - jsonPath: .metadata.creationTimestamp name: Age type: date - name: v1alpha1 + name: v1alpha1ext1 schema: openAPIV3Schema: description: CachedImage is the Schema for the cachedimages API @@ -94,6 +94,15 @@ spec: type: boolean upstreamDigest: type: string + progress: + type: object + properties: + total: + type: integer + description: Total size of the compressed blob in bytes, including all layers. + available: + type: integer + description: Total downloaded / available size of the compressed blob in bytes, including all layers. usedBy: properties: count: diff --git a/go.mod b/go.mod index 13407927..7466b011 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/enix/kube-image-keeper +module github.com/adisplayname/kube-image-keeper go 1.22 diff --git a/helm/kube-image-keeper/crds/cachedimage-crd.yaml b/helm/kube-image-keeper/crds/cachedimage-crd.yaml index cb9a882e..e71415e8 100644 --- a/helm/kube-image-keeper/crds/cachedimage-crd.yaml +++ b/helm/kube-image-keeper/crds/cachedimage-crd.yaml @@ -34,7 +34,10 @@ spec: - jsonPath: .metadata.creationTimestamp name: Age type: date - name: v1alpha1 + - jsonPath: .status.progress.available + name: Downloaded + type: integer + name: v1alpha1ext1 schema: openAPIV3Schema: description: CachedImage is the Schema for the cachedimages API @@ -93,6 +96,15 @@ spec: type: boolean upstreamDigest: type: string + progress: + type: object + properties: + total: + type: integer + description: Total size of the compressed blob in bytes, including all layers. + available: + type: integer + description: Total downloaded / available size of the compressed blob in bytes, including all layers. usedBy: properties: count: diff --git a/internal/controller/collector.go b/internal/controller/collector.go index f3b971a8..3b4f7cc9 100644 --- a/internal/controller/collector.go +++ b/internal/controller/collector.go @@ -4,8 +4,8 @@ import ( "context" "strconv" - kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1" - kuikMetrics "github.com/enix/kube-image-keeper/internal/metrics" + kuikv1alpha1 "github.com/adisplayname/kube-image-keeper/api/kuik/v1alpha1ext1" + kuikMetrics "github.com/adisplayname/kube-image-keeper/internal/metrics" "github.com/prometheus/client_golang/prometheus" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/log" diff --git a/internal/controller/core/pod_controller.go b/internal/controller/core/pod_controller.go index 15839a6c..b8939ee3 100644 --- a/internal/controller/core/pod_controller.go +++ b/internal/controller/core/pod_controller.go @@ -11,9 +11,9 @@ import ( "k8s.io/apimachinery/pkg/selection" "k8s.io/apimachinery/pkg/types" + kuikv1alpha1 "github.com/adisplayname/kube-image-keeper/api/kuik/v1alpha1ext1" + "github.com/adisplayname/kube-image-keeper/internal/registry" "github.com/distribution/reference" - kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1" - "github.com/enix/kube-image-keeper/internal/registry" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" diff --git a/internal/controller/core/pod_controller_test.go b/internal/controller/core/pod_controller_test.go index 54216cf1..d5194c48 100644 --- a/internal/controller/core/pod_controller_test.go +++ b/internal/controller/core/pod_controller_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1" - "github.com/enix/kube-image-keeper/internal/registry" + kuikv1alpha1 "github.com/adisplayname/kube-image-keeper/api/kuik/v1alpha1ext1" + "github.com/adisplayname/kube-image-keeper/internal/registry" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" corev1 "k8s.io/api/core/v1" diff --git a/internal/controller/core/suite_test.go b/internal/controller/core/suite_test.go index 21cedb86..681afeea 100644 --- a/internal/controller/core/suite_test.go +++ b/internal/controller/core/suite_test.go @@ -19,7 +19,7 @@ import ( corev1 "k8s.io/api/core/v1" - kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1" + kuikv1alpha1 "github.com/adisplayname/kube-image-keeper/api/kuik/v1alpha1ext1" //+kubebuilder:scaffold:imports ) diff --git a/internal/controller/kuik/cachedimage_controller.go b/internal/controller/kuik/cachedimage_controller.go index 8aa44153..ab0943aa 100644 --- a/internal/controller/kuik/cachedimage_controller.go +++ b/internal/controller/kuik/cachedimage_controller.go @@ -28,10 +28,10 @@ import ( "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/predicate" - kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1" - kuikController "github.com/enix/kube-image-keeper/internal/controller" - "github.com/enix/kube-image-keeper/internal/controller/core" - "github.com/enix/kube-image-keeper/internal/registry" + kuikv1alpha1 "github.com/adisplayname/kube-image-keeper/api/kuik/v1alpha1ext1" + kuikController "github.com/adisplayname/kube-image-keeper/internal/controller" + "github.com/adisplayname/kube-image-keeper/internal/controller/core" + "github.com/adisplayname/kube-image-keeper/internal/registry" ) const ( diff --git a/internal/controller/kuik/cachedimage_controller_test.go b/internal/controller/kuik/cachedimage_controller_test.go index ad847fba..2146aea2 100644 --- a/internal/controller/kuik/cachedimage_controller_test.go +++ b/internal/controller/kuik/cachedimage_controller_test.go @@ -7,7 +7,7 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1" + kuikv1alpha1 "github.com/adisplayname/kube-image-keeper/api/kuik/v1alpha1ext1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) diff --git a/internal/controller/kuik/repository_controller.go b/internal/controller/kuik/repository_controller.go index cd451ee6..ca6eab17 100644 --- a/internal/controller/kuik/repository_controller.go +++ b/internal/controller/kuik/repository_controller.go @@ -20,9 +20,9 @@ import ( "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/predicate" - kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1" - kuikController "github.com/enix/kube-image-keeper/internal/controller" - "github.com/enix/kube-image-keeper/internal/registry" + kuikv1alpha1 "github.com/adisplayname/kube-image-keeper/api/kuik/v1alpha1ext1" + kuikController "github.com/adisplayname/kube-image-keeper/internal/controller" + "github.com/adisplayname/kube-image-keeper/internal/registry" ) const ( diff --git a/internal/controller/kuik/suite_test.go b/internal/controller/kuik/suite_test.go index 85e6ed2a..06e3214a 100644 --- a/internal/controller/kuik/suite_test.go +++ b/internal/controller/kuik/suite_test.go @@ -39,8 +39,8 @@ import ( logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/log/zap" - kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1" - "github.com/enix/kube-image-keeper/internal/registry" + kuikv1alpha1 "github.com/adisplayname/kube-image-keeper/api/kuik/v1alpha1ext1" + "github.com/adisplayname/kube-image-keeper/internal/registry" //+kubebuilder:scaffold:imports ) diff --git a/internal/proxy/collector.go b/internal/proxy/collector.go index b40305bc..96d47a09 100644 --- a/internal/proxy/collector.go +++ b/internal/proxy/collector.go @@ -3,7 +3,7 @@ package proxy import ( "fmt" - "github.com/enix/kube-image-keeper/internal/metrics" + "github.com/adisplayname/kube-image-keeper/internal/metrics" "github.com/prometheus/client_golang/prometheus" ) diff --git a/internal/proxy/server.go b/internal/proxy/server.go index d68d85a9..c1840ece 100644 --- a/internal/proxy/server.go +++ b/internal/proxy/server.go @@ -12,10 +12,10 @@ import ( "regexp" "strings" + kuikv1alpha1 "github.com/adisplayname/kube-image-keeper/api/kuik/v1alpha1ext1" + "github.com/adisplayname/kube-image-keeper/internal/metrics" + "github.com/adisplayname/kube-image-keeper/internal/registry" "github.com/distribution/reference" - kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1" - "github.com/enix/kube-image-keeper/internal/metrics" - "github.com/enix/kube-image-keeper/internal/registry" "github.com/gin-gonic/gin" "github.com/google/go-containerregistry/pkg/authn" "github.com/google/go-containerregistry/pkg/name" diff --git a/internal/scheme/scheme.go b/internal/scheme/scheme.go index a685106d..4b9b852b 100644 --- a/internal/scheme/scheme.go +++ b/internal/scheme/scheme.go @@ -10,7 +10,7 @@ import ( utilruntime "k8s.io/apimachinery/pkg/util/runtime" clientgoscheme "k8s.io/client-go/kubernetes/scheme" - kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1" + kuikv1alpha1 "github.com/adisplayname/kube-image-keeper/api/kuik/v1alpha1ext1" //+kubebuilder:scaffold:imports ) From 96d446f1b19afe3ad0bab213d4d0bf3ecd267623 Mon Sep 17 00:00:00 2001 From: aDisplayName Date: Tue, 20 Aug 2024 11:15:16 -0500 Subject: [PATCH 07/33] Update readme.md (#3) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b7c8e265..3b300bbd 100644 --- a/README.md +++ b/README.md @@ -217,7 +217,7 @@ Note that persistence requires your cluster to have some PersistentVolumes. If y Sometimes, you want images to stay cached even when they are not used anymore (for instance when you run a workload for a fixed amount of time, stop it, and run it again later). You can choose to prevent `CachedImages` from expiring by manually setting the `spec.retain` flag to `true` like shown below: ```yaml -apiVersion: kuik.enix.io/v1alpha1 +apiVersion: kuik.enix.io/v1alpha1ext1 kind: CachedImage metadata: name: docker.io-library-nginx-1.25 From 724db34766ab2defb30c92b6d6179bfdcca09494 Mon Sep 17 00:00:00 2001 From: aDisplayName Date: Tue, 20 Aug 2024 11:18:07 -0500 Subject: [PATCH 08/33] fix: Commit message. add progress in cachedimage crd * Update readme.md * Update the readme again --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3b300bbd..37a9f06e 100644 --- a/README.md +++ b/README.md @@ -160,7 +160,7 @@ You can use Helm to generate plain YAML files and then deploy these YAML files w ```bash helm template --namespace kuik-system \ kube-image-keeper kube-image-keeper \ - --repo https://charts.enix.io/ \ + --repo https://adisplayname.github.io/helm-charts/charts \ > /tmp/kuik.yaml kubectl create namespace kuik-system kubectl apply -f /tmp/kuik.yaml --namespace kuik-system @@ -178,7 +178,7 @@ For instance, to extend the expiration delay to 3 months (90 days), you can depl helm upgrade --install \ --create-namespace --namespace kuik-system \ kube-image-keeper kube-image-keeper \ - --repo https://charts.enix.io/ \ + --repo https://adisplayname.github.io/helm-charts/charts \ --set cachedImagesExpiryDelay=90 ``` From 53b79dfc43da0240e1fac2dd429f79b2e39b5cae Mon Sep 17 00:00:00 2001 From: aDisplayName Date: Tue, 20 Aug 2024 16:55:20 -0500 Subject: [PATCH 09/33] fix: Update Repository CRD (#5) --- .../crd/bases/kuik.enix.io_cachedimages.yaml | 18 +++++++++--------- .../crd/bases/kuik.enix.io_repositories.yaml | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/config/crd/bases/kuik.enix.io_cachedimages.yaml b/config/crd/bases/kuik.enix.io_cachedimages.yaml index 1f2c33cd..ed026612 100644 --- a/config/crd/bases/kuik.enix.io_cachedimages.yaml +++ b/config/crd/bases/kuik.enix.io_cachedimages.yaml @@ -90,19 +90,19 @@ spec: type: string phase: type: string - upToDate: - type: boolean - upstreamDigest: - type: string progress: - type: object properties: - total: - type: integer - description: Total size of the compressed blob in bytes, including all layers. available: + format: int64 type: integer - description: Total downloaded / available size of the compressed blob in bytes, including all layers. + total: + format: int64 + type: integer + type: object + upToDate: + type: boolean + upstreamDigest: + type: string usedBy: properties: count: diff --git a/config/crd/bases/kuik.enix.io_repositories.yaml b/config/crd/bases/kuik.enix.io_repositories.yaml index 0a72227c..9fb46748 100644 --- a/config/crd/bases/kuik.enix.io_repositories.yaml +++ b/config/crd/bases/kuik.enix.io_repositories.yaml @@ -26,7 +26,7 @@ spec: - jsonPath: .metadata.creationTimestamp name: Age type: date - name: v1alpha1 + name: v1alpha1ext1 schema: openAPIV3Schema: description: Repository is the Schema for the repositories API From 97514b2a3c652236936c88d57ee264a462c9ae5b Mon Sep 17 00:00:00 2001 From: aDisplayName Date: Tue, 20 Aug 2024 17:13:40 -0500 Subject: [PATCH 10/33] fix: Fix repository CRD (#6) --- config/samples/kuik_v1alpha1_cachedimage.yaml | 2 +- config/samples/kuik_v1alpha1_repository.yaml | 2 +- helm/kube-image-keeper/crds/repository-crd.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/config/samples/kuik_v1alpha1_cachedimage.yaml b/config/samples/kuik_v1alpha1_cachedimage.yaml index 4041c88e..15156eea 100644 --- a/config/samples/kuik_v1alpha1_cachedimage.yaml +++ b/config/samples/kuik_v1alpha1_cachedimage.yaml @@ -1,4 +1,4 @@ -apiVersion: kuik.enix.io/v1alpha1 +apiVersion: kuik.enix.io/v1alpha1ext1 kind: CachedImage metadata: labels: diff --git a/config/samples/kuik_v1alpha1_repository.yaml b/config/samples/kuik_v1alpha1_repository.yaml index 5da5193e..8056d0b1 100644 --- a/config/samples/kuik_v1alpha1_repository.yaml +++ b/config/samples/kuik_v1alpha1_repository.yaml @@ -1,4 +1,4 @@ -apiVersion: kuik.enix.io/v1alpha1 +apiVersion: kuik.enix.io/v1alpha1ext1 kind: Repository metadata: labels: diff --git a/helm/kube-image-keeper/crds/repository-crd.yaml b/helm/kube-image-keeper/crds/repository-crd.yaml index 5bf51081..599b28d1 100644 --- a/helm/kube-image-keeper/crds/repository-crd.yaml +++ b/helm/kube-image-keeper/crds/repository-crd.yaml @@ -25,7 +25,7 @@ spec: - jsonPath: .metadata.creationTimestamp name: Age type: date - name: v1alpha1 + name: v1alpha1ext1 schema: openAPIV3Schema: description: Repository is the Schema for the repositories API From 4ce6da360551706381431611c56246878087ca1d Mon Sep 17 00:00:00 2001 From: aDisplayName Date: Wed, 21 Aug 2024 09:09:15 -0500 Subject: [PATCH 11/33] fix: Update README.md From 2bd338ca4fdef1577185bbc7d33a7c8c9282d516 Mon Sep 17 00:00:00 2001 From: aDisplayName Date: Wed, 21 Aug 2024 15:54:50 -0500 Subject: [PATCH 12/33] feat: Add callback with progress update (#7) * Add callback with progress update * Only update progress output every 5 seconds * Fix error * fix unit test * Fix unit test --- .../controller/kuik/cachedimage_controller.go | 23 ++++++++++++++++++- internal/registry/registry.go | 16 +++++++++++-- internal/registry/registry_test.go | 2 +- 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/internal/controller/kuik/cachedimage_controller.go b/internal/controller/kuik/cachedimage_controller.go index ab0943aa..ad0fba3b 100644 --- a/internal/controller/kuik/cachedimage_controller.go +++ b/internal/controller/kuik/cachedimage_controller.go @@ -3,12 +3,14 @@ package kuik import ( "context" "crypto/x509" + "fmt" "net/http" "strings" "time" "github.com/distribution/reference" "github.com/go-logr/logr" + v1 "github.com/google/go-containerregistry/pkg/v1" "github.com/google/go-containerregistry/pkg/v1/remote" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" @@ -343,7 +345,26 @@ func (r *CachedImageReconciler) cacheImage(cachedImage *kuikv1alpha1.CachedImage return err } - err = registry.CacheImage(cachedImage.Spec.SourceImage, desc, r.Architectures) + lastUpdateTime := time.Now() + lastWriteComplete := int64(0) + onUpdated := func(update v1.Update) { + needUpdate := false + if lastWriteComplete != update.Complete && update.Complete == update.Total { + // Update is needed whenever the writing complmetes. + needUpdate = true + } + + if time.Since(lastUpdateTime).Seconds() >= 5 { + // Update is needed if last update is more than 5 seconds ago + needUpdate = true + } + if needUpdate { + fmt.Printf("%s - %d/%d", cachedImage.Spec.SourceImage, update.Complete, update.Total) + lastUpdateTime = time.Now() + } + lastWriteComplete = update.Complete + } + err = registry.CacheImage(cachedImage.Spec.SourceImage, desc, r.Architectures, onUpdated) statusErr = updateStatus(r.Client, cachedImage, desc, func(status *kuikv1alpha1.CachedImageStatus) { if err == nil { diff --git a/internal/registry/registry.go b/internal/registry/registry.go index 3c187601..486eb2c4 100644 --- a/internal/registry/registry.go +++ b/internal/registry/registry.go @@ -123,7 +123,7 @@ func DeleteImage(imageName string) error { return remote.Delete(digest) } -func CacheImage(imageName string, desc *remote.Descriptor, architectures []string) error { +func CacheImage(imageName string, desc *remote.Descriptor, architectures []string, callback func(v1.Update)) error { destRef, err := parseLocalReference(imageName) if err != nil { return err @@ -149,11 +149,23 @@ func CacheImage(imageName string, desc *remote.Descriptor, architectures []strin return err } default: + + progressUpdate := make(chan v1.Update, 100) + + go func() { + for update := range progressUpdate { + if callback != nil { + callback(update) + } + } + }() + image, err := desc.Image() if err != nil { return err } - if err := remote.Write(destRef, image); err != nil { + + if err := remote.Write(destRef, image, remote.WithProgress(progressUpdate)); err != nil { return err } } diff --git a/internal/registry/registry_test.go b/internal/registry/registry_test.go index a7635388..fdce494d 100644 --- a/internal/registry/registry_test.go +++ b/internal/registry/registry_test.go @@ -320,7 +320,7 @@ func Test_CacheImage(t *testing.T) { desc, err := remote.Get(sourceRef) g.Expect(err).To(BeNil()) - err = CacheImage(imageName, desc, []string{"amd64"}) + err = CacheImage(imageName, desc, []string{"amd64"}, nil) if tt.wantErr != "" { g.Expect(err).To(BeAssignableToTypeOf(tt.errType)) g.Expect(err).To(MatchError(ContainSubstring(tt.wantErr))) From 56ca1fd494346733c6b5c71e298e59085773eefc Mon Sep 17 00:00:00 2001 From: aDisplayName Date: Wed, 21 Aug 2024 16:04:34 -0500 Subject: [PATCH 13/33] fix: Fix branding in docker build (#8) --- .github/workflows/tests.yaml | 8 ++++---- Dockerfile | 6 +++--- helm/kube-image-keeper/values.yaml | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 0315e64e..d45efa5b 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -13,10 +13,10 @@ jobs: runs-on: ubuntu-22.04 env: VERSION: ${{ github.run_id }} - HARBOR_URL: "harbor.enix.io" - HARBOR_REPO: "kube-image-keeper/kube-image-keeper" - GHCR_IMAGE: "ghcr.io/enix/kube-image-keeper" - QUAY_IMAGE: "quay.io/enix/kube-image-keeper" + GHCR_IMAGE: "ghcr.io/adisplayname/kube-image-keeper" + # HARBOR_URL: "harbor.enix.io" + # HARBOR_REPO: "kube-image-keeper/kube-image-keeper" + # QUAY_IMAGE: "quay.io/adisplayname/kube-image-keeper" steps: - name: Checkout Repository uses: actions/checkout@v4 diff --git a/Dockerfile b/Dockerfile index 8edff9c8..9cfc03c3 100644 --- a/Dockerfile +++ b/Dockerfile @@ -27,9 +27,9 @@ ENV CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} ARG VERSION ARG REVISION ENV LD_FLAGS="\ - -X 'github.com/enix/kube-image-keeper/internal/metrics.Version=${VERSION}' \ - -X 'github.com/enix/kube-image-keeper/internal/metrics.Revision=${REVISION}' \ - -X 'github.com/enix/kube-image-keeper/internal/metrics.BuildDateTime=BUILD_DATE_TIME'" + -X 'github.com/adisplayname/kube-image-keeper/internal/metrics.Version=${VERSION}' \ + -X 'github.com/adisplayname/kube-image-keeper/internal/metrics.Revision=${REVISION}' \ + -X 'github.com/adisplayname/kube-image-keeper/internal/metrics.BuildDateTime=BUILD_DATE_TIME'" RUN --mount=type=cache,target="/root/.cache/go-build" \ BUILD_DATE_TIME=$(date -u +"%Y-%m-%dT%H:%M:%S") && \ diff --git a/helm/kube-image-keeper/values.yaml b/helm/kube-image-keeper/values.yaml index 939cde73..3145eba0 100644 --- a/helm/kube-image-keeper/values.yaml +++ b/helm/kube-image-keeper/values.yaml @@ -20,7 +20,7 @@ controllers: replicas: 2 image: # -- Controller image repository. Also available: `quay.io/enix/kube-image-keeper` - repository: ghcr.io/enix/kube-image-keeper + repository: ghcr.io/adisplayname/kube-image-keeper # -- Controller image pull policy pullPolicy: IfNotPresent # -- Controller image tag. Default chart appVersion @@ -104,7 +104,7 @@ controllers: proxy: image: # -- Proxy image repository. Also available: `quay.io/enix/kube-image-keeper` - repository: ghcr.io/enix/kube-image-keeper + repository: ghcr.io/adisplayname/kube-image-keeper # -- Proxy image pull policy pullPolicy: IfNotPresent # -- Proxy image tag. Default chart appVersion From 11714b1110499bbff6782263c808e819b266cda8 Mon Sep 17 00:00:00 2001 From: aDisplayName Date: Wed, 21 Aug 2024 17:04:40 -0500 Subject: [PATCH 14/33] fix: Update CRD with progress --- internal/controller/kuik/cachedimage_controller.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/internal/controller/kuik/cachedimage_controller.go b/internal/controller/kuik/cachedimage_controller.go index ad0fba3b..9d8a873c 100644 --- a/internal/controller/kuik/cachedimage_controller.go +++ b/internal/controller/kuik/cachedimage_controller.go @@ -3,7 +3,6 @@ package kuik import ( "context" "crypto/x509" - "fmt" "net/http" "strings" "time" @@ -359,7 +358,11 @@ func (r *CachedImageReconciler) cacheImage(cachedImage *kuikv1alpha1.CachedImage needUpdate = true } if needUpdate { - fmt.Printf("%s - %d/%d", cachedImage.Spec.SourceImage, update.Complete, update.Total) + updateStatus(r.Client, cachedImage, desc, func(status *kuikv1alpha1.CachedImageStatus) { + cachedImage.Status.Progress.Total = update.Total + cachedImage.Status.Progress.Available = update.Complete + }) + lastUpdateTime = time.Now() } lastWriteComplete = update.Complete From 7183d228c8add566a173f71724b351d809210e4c Mon Sep 17 00:00:00 2001 From: aDisplayName Date: Wed, 21 Aug 2024 17:08:12 -0500 Subject: [PATCH 15/33] fix: Force rebuild release --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 37a9f06e..83800d05 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ It saves the container images used by your pods in its own local registry so tha ## Upgrading ### From 1.6.0 o 1.7.0 - + ***ACTION REQUIRED*** To follow Helm3 best pratices, we moved `cachedimage` and `repository` custom resources definition from the helm templates directory to the dedicated `crds` directory. From 6076cacae41a9483e97aea61ce309a4d906b32da Mon Sep 17 00:00:00 2001 From: aDisplayName Date: Thu, 22 Aug 2024 09:26:03 -0500 Subject: [PATCH 16/33] fix: reduce rate limit --- .releaserc.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.releaserc.json b/.releaserc.json index 0de0a73d..bfdb2409 100644 --- a/.releaserc.json +++ b/.releaserc.json @@ -11,6 +11,8 @@ [ "@semantic-release/github", { + "successComment": false, + "failTitle": false, "assets": [ "CHANGELOG.md", "../assets/*" From 1ce48d35f9a01b86b1933951920e7b0613b23795 Mon Sep 17 00:00:00 2001 From: aDisplayName Date: Mon, 26 Aug 2024 08:33:19 -0500 Subject: [PATCH 17/33] fix: Add logging regardless on every call back (#10) --- .../controller/kuik/cachedimage_controller.go | 5 +- internal/registry/test_test.go | 69 +++++++++++++++++++ 2 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 internal/registry/test_test.go diff --git a/internal/controller/kuik/cachedimage_controller.go b/internal/controller/kuik/cachedimage_controller.go index 9d8a873c..48240d02 100644 --- a/internal/controller/kuik/cachedimage_controller.go +++ b/internal/controller/kuik/cachedimage_controller.go @@ -241,7 +241,7 @@ func (r *CachedImageReconciler) Reconcile(ctx context.Context, req ctrl.Request) } if putImageInCache { r.Recorder.Eventf(&cachedImage, "Normal", "Caching", "Start caching image %s", cachedImage.Spec.SourceImage) - err = r.cacheImage(&cachedImage) + err = r.cacheImage(&cachedImage, log) if err != nil { log.Error(err, "failed to cache image") r.Recorder.Eventf(&cachedImage, "Warning", "CacheFailed", "Failed to cache image %s, reason: %s", cachedImage.Spec.SourceImage, err) @@ -308,7 +308,7 @@ func getSanitizedName(cachedImage *kuikv1alpha1.CachedImage) (string, error) { return sanitizedName, nil } -func (r *CachedImageReconciler) cacheImage(cachedImage *kuikv1alpha1.CachedImage) error { +func (r *CachedImageReconciler) cacheImage(cachedImage *kuikv1alpha1.CachedImage, log logr.Logger) error { if err := r.patchPhase(cachedImage, cachedImagePhaseSynchronizing); err != nil { return err } @@ -347,6 +347,7 @@ func (r *CachedImageReconciler) cacheImage(cachedImage *kuikv1alpha1.CachedImage lastUpdateTime := time.Now() lastWriteComplete := int64(0) onUpdated := func(update v1.Update) { + log.Info("OnUpdate") needUpdate := false if lastWriteComplete != update.Complete && update.Complete == update.Total { // Update is needed whenever the writing complmetes. diff --git a/internal/registry/test_test.go b/internal/registry/test_test.go new file mode 100644 index 00000000..2f3f8d7e --- /dev/null +++ b/internal/registry/test_test.go @@ -0,0 +1,69 @@ +package registry + +/* +import ( + "fmt" + "os" + "testing" + + cranepkg "github.com/google/go-containerregistry/pkg/v1" + "github.com/google/go-containerregistry/pkg/v1/remote" + "github.com/google/go-containerregistry/pkg/v1/tarball" + "github.com/google/go-containerregistry/pkg/v1/types" + v1 "k8s.io/api/core/v1" +) + +// Write remote image to tarball file +func Test_parsing(t *testing.T) { + + sourceImangeName := "mcr.microsoft.com/powershell:lts" + desc, _ := GetDescriptor(sourceImangeName, []v1.Secret{}, []string{}, nil) + destRef, _ := parseLocalReference(sourceImangeName) + // architectures := []string{"amd64"} + switch desc.MediaType { + case types.OCIImageIndex, types.DockerManifestList: + // index, err := desc.ImageIndex() + // if err != nil { + // return + // } + // filteredIndex := mutate.RemoveManifests(index, func(desc cranepkg.Descriptor) bool { + // for _, arch := range architectures { + // if arch == desc.Platform.Architecture { + // return false + // } + // } + // return true + // }) + + // if err := remote.WriteIndex(destRef, filteredIndex); err != nil { + // return + // } + var k = 1 + k = k + 1 + + progressUpdate := make(chan cranepkg.Update, 100) + callback := func(u cranepkg.Update) { + fmt.Print(u.Complete) + } + go func() { + for update := range progressUpdate { + if callback != nil { + callback(update) + } + } + }() + image, err := desc.Image() + if err != nil { + return + } + file, err := os.Create("output.tar") + if err := tarball.Write(destRef, image, file, tarball.WithProgress(progressUpdate)); err != nil { + return + } + + if err := remote.Write(destRef, image, remote.WithProgress(progressUpdate)); err != nil { + return + } + } +} +*/ From 8e83c1ba578f7fb9edc20a549ca36d684f4837d3 Mon Sep 17 00:00:00 2001 From: aDisplayName Date: Mon, 26 Aug 2024 09:28:39 -0500 Subject: [PATCH 18/33] fix: Add more logs (#11) * Add more logs * Reduce the unit test checking --- .github/workflows/pr-code.yml | 2 +- internal/controller/kuik/cachedimage_controller.go | 3 ++- internal/registry/registry.go | 10 ++++++++-- internal/registry/registry_test.go | 3 ++- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/.github/workflows/pr-code.yml b/.github/workflows/pr-code.yml index 1781f980..418f1254 100644 --- a/.github/workflows/pr-code.yml +++ b/.github/workflows/pr-code.yml @@ -39,7 +39,7 @@ jobs: name: Unit Testing strategy: matrix: - kubernetes-version: ['1.24', '1.25', '1.26', '1.27', '1.28', '1.29'] + kubernetes-version: ['1.24'] runs-on: ubuntu-22.04 env: ENVTEST_K8S_VERSION: ${{ matrix.kubernetes-version }} diff --git a/internal/controller/kuik/cachedimage_controller.go b/internal/controller/kuik/cachedimage_controller.go index 48240d02..8690ea15 100644 --- a/internal/controller/kuik/cachedimage_controller.go +++ b/internal/controller/kuik/cachedimage_controller.go @@ -368,7 +368,8 @@ func (r *CachedImageReconciler) cacheImage(cachedImage *kuikv1alpha1.CachedImage } lastWriteComplete = update.Complete } - err = registry.CacheImage(cachedImage.Spec.SourceImage, desc, r.Architectures, onUpdated) + log.Info("Start caching", "SourceImage", cachedImage.Spec.SourceImage, "Destination", desc.URLs) + err = registry.CacheImage(cachedImage.Spec.SourceImage, desc, r.Architectures, onUpdated, log) statusErr = updateStatus(r.Client, cachedImage, desc, func(status *kuikv1alpha1.CachedImageStatus) { if err == nil { diff --git a/internal/registry/registry.go b/internal/registry/registry.go index 486eb2c4..9d6996d9 100644 --- a/internal/registry/registry.go +++ b/internal/registry/registry.go @@ -11,6 +11,7 @@ import ( "regexp" "strings" + "github.com/go-logr/logr" "github.com/google/go-containerregistry/pkg/authn" "github.com/google/go-containerregistry/pkg/name" v1 "github.com/google/go-containerregistry/pkg/v1" @@ -123,7 +124,8 @@ func DeleteImage(imageName string) error { return remote.Delete(digest) } -func CacheImage(imageName string, desc *remote.Descriptor, architectures []string, callback func(v1.Update)) error { +func CacheImage(imageName string, desc *remote.Descriptor, architectures []string, callback func(v1.Update), log logr.Logger) error { + log.Info("Get parsed local reference", "Input", imageName) destRef, err := parseLocalReference(imageName) if err != nil { return err @@ -149,11 +151,12 @@ func CacheImage(imageName string, desc *remote.Descriptor, architectures []strin return err } default: - + log.Info("prep sync update") progressUpdate := make(chan v1.Update, 100) go func() { for update := range progressUpdate { + log.Info("OnProgress update called") if callback != nil { callback(update) } @@ -165,9 +168,12 @@ func CacheImage(imageName string, desc *remote.Descriptor, architectures []strin return err } + log.Info("Start sync") if err := remote.Write(destRef, image, remote.WithProgress(progressUpdate)); err != nil { + log.Error(err, "Sync erred") return err } + log.Info("Sync completed") } return nil diff --git a/internal/registry/registry_test.go b/internal/registry/registry_test.go index fdce494d..c6b7f983 100644 --- a/internal/registry/registry_test.go +++ b/internal/registry/registry_test.go @@ -9,6 +9,7 @@ import ( "strings" "testing" + "github.com/go-logr/logr" "github.com/google/go-containerregistry/pkg/name" "github.com/google/go-containerregistry/pkg/v1/remote" "github.com/google/go-containerregistry/pkg/v1/remote/transport" @@ -320,7 +321,7 @@ func Test_CacheImage(t *testing.T) { desc, err := remote.Get(sourceRef) g.Expect(err).To(BeNil()) - err = CacheImage(imageName, desc, []string{"amd64"}, nil) + err = CacheImage(imageName, desc, []string{"amd64"}, nil, logr.Discard()) if tt.wantErr != "" { g.Expect(err).To(BeAssignableToTypeOf(tt.errType)) g.Expect(err).To(MatchError(ContainSubstring(tt.wantErr))) From fcbcab6a44871f238911f3bc0afe5c04425edaf5 Mon Sep 17 00:00:00 2001 From: aDisplayName Date: Mon, 26 Aug 2024 11:21:09 -0500 Subject: [PATCH 19/33] add even more logs --- internal/registry/registry.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/internal/registry/registry.go b/internal/registry/registry.go index 9d6996d9..fc4231ad 100644 --- a/internal/registry/registry.go +++ b/internal/registry/registry.go @@ -128,13 +128,16 @@ func CacheImage(imageName string, desc *remote.Descriptor, architectures []strin log.Info("Get parsed local reference", "Input", imageName) destRef, err := parseLocalReference(imageName) if err != nil { + log.Error(err, "Failed to parse local reference") return err } switch desc.MediaType { case types.OCIImageIndex, types.DockerManifestList: + log.Info("media type matched:", "type", desc.MediaType) index, err := desc.ImageIndex() if err != nil { + log.Error(err, "Unable to get image Index") return err } @@ -147,7 +150,9 @@ func CacheImage(imageName string, desc *remote.Descriptor, architectures []strin return true }) + log.Info("Writing out indexes") if err := remote.WriteIndex(destRef, filteredIndex); err != nil { + log.Error(err, "Failed to writing out index") return err } default: From e679aa7bf4c22eefce4f7081e1291f9566c29efc Mon Sep 17 00:00:00 2001 From: aDisplayName Date: Mon, 26 Aug 2024 11:31:13 -0500 Subject: [PATCH 20/33] fix: Title (#13) --- internal/registry/registry.go | 1 + 1 file changed, 1 insertion(+) diff --git a/internal/registry/registry.go b/internal/registry/registry.go index fc4231ad..f36e6382 100644 --- a/internal/registry/registry.go +++ b/internal/registry/registry.go @@ -151,6 +151,7 @@ func CacheImage(imageName string, desc *remote.Descriptor, architectures []strin }) log.Info("Writing out indexes") + if err := remote.WriteIndex(destRef, filteredIndex); err != nil { log.Error(err, "Failed to writing out index") return err From 32859308f816718ab12429a7f8882b2ab41092f7 Mon Sep 17 00:00:00 2001 From: aDisplayName Date: Mon, 26 Aug 2024 11:50:24 -0500 Subject: [PATCH 21/33] fix: Move progress update to outter loop (#14) --- internal/registry/registry.go | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/internal/registry/registry.go b/internal/registry/registry.go index f36e6382..0a599d6e 100644 --- a/internal/registry/registry.go +++ b/internal/registry/registry.go @@ -132,6 +132,17 @@ func CacheImage(imageName string, desc *remote.Descriptor, architectures []strin return err } + progressUpdate := make(chan v1.Update, 100) + defer close(progressUpdate) + go func() { + for update := range progressUpdate { + log.Info("OnProgress update called") + if callback != nil { + callback(update) + } + } + }() + switch desc.MediaType { case types.OCIImageIndex, types.DockerManifestList: log.Info("media type matched:", "type", desc.MediaType) @@ -152,22 +163,12 @@ func CacheImage(imageName string, desc *remote.Descriptor, architectures []strin log.Info("Writing out indexes") - if err := remote.WriteIndex(destRef, filteredIndex); err != nil { + if err := remote.WriteIndex(destRef, filteredIndex, remote.WithProgress(progressUpdate)); err != nil { log.Error(err, "Failed to writing out index") return err } default: log.Info("prep sync update") - progressUpdate := make(chan v1.Update, 100) - - go func() { - for update := range progressUpdate { - log.Info("OnProgress update called") - if callback != nil { - callback(update) - } - } - }() image, err := desc.Image() if err != nil { From 88acc28a07c696626c2da56704b03f9ac334c57d Mon Sep 17 00:00:00 2001 From: aDisplayName Date: Mon, 26 Aug 2024 12:08:54 -0500 Subject: [PATCH 22/33] fix: Fix unit test (#15) --- internal/registry/registry.go | 1 - 1 file changed, 1 deletion(-) diff --git a/internal/registry/registry.go b/internal/registry/registry.go index 0a599d6e..771c182e 100644 --- a/internal/registry/registry.go +++ b/internal/registry/registry.go @@ -133,7 +133,6 @@ func CacheImage(imageName string, desc *remote.Descriptor, architectures []strin } progressUpdate := make(chan v1.Update, 100) - defer close(progressUpdate) go func() { for update := range progressUpdate { log.Info("OnProgress update called") From fbf572eef0ca1e38ab7660cc2fc9644375d7443e Mon Sep 17 00:00:00 2001 From: aDisplayName Date: Mon, 26 Aug 2024 12:45:04 -0500 Subject: [PATCH 23/33] fix: Remove debug log (#16) --- .../controller/kuik/cachedimage_controller.go | 8 +++----- internal/registry/registry.go | 16 +--------------- internal/registry/registry_test.go | 3 +-- 3 files changed, 5 insertions(+), 22 deletions(-) diff --git a/internal/controller/kuik/cachedimage_controller.go b/internal/controller/kuik/cachedimage_controller.go index 8690ea15..9d8a873c 100644 --- a/internal/controller/kuik/cachedimage_controller.go +++ b/internal/controller/kuik/cachedimage_controller.go @@ -241,7 +241,7 @@ func (r *CachedImageReconciler) Reconcile(ctx context.Context, req ctrl.Request) } if putImageInCache { r.Recorder.Eventf(&cachedImage, "Normal", "Caching", "Start caching image %s", cachedImage.Spec.SourceImage) - err = r.cacheImage(&cachedImage, log) + err = r.cacheImage(&cachedImage) if err != nil { log.Error(err, "failed to cache image") r.Recorder.Eventf(&cachedImage, "Warning", "CacheFailed", "Failed to cache image %s, reason: %s", cachedImage.Spec.SourceImage, err) @@ -308,7 +308,7 @@ func getSanitizedName(cachedImage *kuikv1alpha1.CachedImage) (string, error) { return sanitizedName, nil } -func (r *CachedImageReconciler) cacheImage(cachedImage *kuikv1alpha1.CachedImage, log logr.Logger) error { +func (r *CachedImageReconciler) cacheImage(cachedImage *kuikv1alpha1.CachedImage) error { if err := r.patchPhase(cachedImage, cachedImagePhaseSynchronizing); err != nil { return err } @@ -347,7 +347,6 @@ func (r *CachedImageReconciler) cacheImage(cachedImage *kuikv1alpha1.CachedImage lastUpdateTime := time.Now() lastWriteComplete := int64(0) onUpdated := func(update v1.Update) { - log.Info("OnUpdate") needUpdate := false if lastWriteComplete != update.Complete && update.Complete == update.Total { // Update is needed whenever the writing complmetes. @@ -368,8 +367,7 @@ func (r *CachedImageReconciler) cacheImage(cachedImage *kuikv1alpha1.CachedImage } lastWriteComplete = update.Complete } - log.Info("Start caching", "SourceImage", cachedImage.Spec.SourceImage, "Destination", desc.URLs) - err = registry.CacheImage(cachedImage.Spec.SourceImage, desc, r.Architectures, onUpdated, log) + err = registry.CacheImage(cachedImage.Spec.SourceImage, desc, r.Architectures, onUpdated) statusErr = updateStatus(r.Client, cachedImage, desc, func(status *kuikv1alpha1.CachedImageStatus) { if err == nil { diff --git a/internal/registry/registry.go b/internal/registry/registry.go index 771c182e..48e68819 100644 --- a/internal/registry/registry.go +++ b/internal/registry/registry.go @@ -11,7 +11,6 @@ import ( "regexp" "strings" - "github.com/go-logr/logr" "github.com/google/go-containerregistry/pkg/authn" "github.com/google/go-containerregistry/pkg/name" v1 "github.com/google/go-containerregistry/pkg/v1" @@ -124,18 +123,15 @@ func DeleteImage(imageName string) error { return remote.Delete(digest) } -func CacheImage(imageName string, desc *remote.Descriptor, architectures []string, callback func(v1.Update), log logr.Logger) error { - log.Info("Get parsed local reference", "Input", imageName) +func CacheImage(imageName string, desc *remote.Descriptor, architectures []string, callback func(v1.Update)) error { destRef, err := parseLocalReference(imageName) if err != nil { - log.Error(err, "Failed to parse local reference") return err } progressUpdate := make(chan v1.Update, 100) go func() { for update := range progressUpdate { - log.Info("OnProgress update called") if callback != nil { callback(update) } @@ -144,10 +140,8 @@ func CacheImage(imageName string, desc *remote.Descriptor, architectures []strin switch desc.MediaType { case types.OCIImageIndex, types.DockerManifestList: - log.Info("media type matched:", "type", desc.MediaType) index, err := desc.ImageIndex() if err != nil { - log.Error(err, "Unable to get image Index") return err } @@ -160,26 +154,18 @@ func CacheImage(imageName string, desc *remote.Descriptor, architectures []strin return true }) - log.Info("Writing out indexes") - if err := remote.WriteIndex(destRef, filteredIndex, remote.WithProgress(progressUpdate)); err != nil { - log.Error(err, "Failed to writing out index") return err } default: - log.Info("prep sync update") - image, err := desc.Image() if err != nil { return err } - log.Info("Start sync") if err := remote.Write(destRef, image, remote.WithProgress(progressUpdate)); err != nil { - log.Error(err, "Sync erred") return err } - log.Info("Sync completed") } return nil diff --git a/internal/registry/registry_test.go b/internal/registry/registry_test.go index c6b7f983..fdce494d 100644 --- a/internal/registry/registry_test.go +++ b/internal/registry/registry_test.go @@ -9,7 +9,6 @@ import ( "strings" "testing" - "github.com/go-logr/logr" "github.com/google/go-containerregistry/pkg/name" "github.com/google/go-containerregistry/pkg/v1/remote" "github.com/google/go-containerregistry/pkg/v1/remote/transport" @@ -321,7 +320,7 @@ func Test_CacheImage(t *testing.T) { desc, err := remote.Get(sourceRef) g.Expect(err).To(BeNil()) - err = CacheImage(imageName, desc, []string{"amd64"}, nil, logr.Discard()) + err = CacheImage(imageName, desc, []string{"amd64"}, nil) if tt.wantErr != "" { g.Expect(err).To(BeAssignableToTypeOf(tt.errType)) g.Expect(err).To(MatchError(ContainSubstring(tt.wantErr))) From d73deb838b3409b393d5d7fb12be191abc89b8ca Mon Sep 17 00:00:00 2001 From: aDisplayName Date: Mon, 26 Aug 2024 15:17:33 -0500 Subject: [PATCH 24/33] Revert back chagnes on github --- .github/workflows/pr-code.yml | 4 +- .github/workflows/release.yml | 742 +++++++++++++++++----------------- .github/workflows/tests.yaml | 11 +- 3 files changed, 376 insertions(+), 381 deletions(-) diff --git a/.github/workflows/pr-code.yml b/.github/workflows/pr-code.yml index 418f1254..f10f2173 100644 --- a/.github/workflows/pr-code.yml +++ b/.github/workflows/pr-code.yml @@ -39,7 +39,7 @@ jobs: name: Unit Testing strategy: matrix: - kubernetes-version: ['1.24'] + kubernetes-version: ['1.24', '1.25', '1.26', '1.27', '1.28', '1.29'] runs-on: ubuntu-22.04 env: ENVTEST_K8S_VERSION: ${{ matrix.kubernetes-version }} @@ -74,4 +74,4 @@ jobs: uses: actions/upload-artifact@v4 with: name: code-coverage-report-${{ matrix.kubernetes-version }} - path: coverage.html + path: coverage.html \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b3a97784..d3d0fa8b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -8,8 +8,8 @@ concurrency: cancel-in-progress: false env: - COMMIT_NAME: aDisplayNam3 - COMMIT_EMAIL: mattali@gmail.com + COMMIT_NAME: Monkeynator + COMMIT_EMAIL: monkeynator@enix.io jobs: semver: @@ -36,8 +36,7 @@ jobs: with: dry_run: true env: - # GITHUB_TOKEN: ${{ secrets.RELEASE_GITHUB_TOKEN }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.RELEASE_GITHUB_TOKEN }} - name: Inspect semantic-release (dry-run) outcome shell: python @@ -113,347 +112,346 @@ jobs: --chart-repos bitnami=https://charts.bitnami.com/bitnami \ --validate-maintainers=false --check-version-increment=false - # build: - # name: Build test image - # needs: - # - semver - # - tests - # runs-on: ubuntu-22.04 - # env: - # VERSION: ${{ github.run_id }} - # # HARBOR_URL: "harbor.enix.io" - # # HARBOR_REPO: "kube-image-keeper/kube-image-keeper" - # GHCR_IMAGE: "ghcr.io/adisplayname/kube-image-keeper" - # # QUAY_IMAGE: "quay.io/enix/kube-image-keeper" - # steps: - # - name: Checkout Repository - # uses: actions/checkout@v4 - # with: - # path: repository - - # - name: Set up Docker Buildx - # uses: docker/setup-buildx-action@v3 - - # # - name: Log in to the Container registry - # # uses: docker/login-action@v3 - # # with: - # # registry: ${{ env.HARBOR_URL }} - # # username: ${{ secrets.HARBOR_USERNAME }} - # # password: ${{ secrets.HARBOR_PASSWORD }} - - # - name: Generate image metadata - # id: meta - # uses: docker/metadata-action@v5 - # with: - # images: | - # ${{ env.GHCR_IMAGE }} - # # ${{ github.repository }} - # # ${{ env.QUAY_IMAGE }} - - # - name: Build container images - # uses: docker/build-push-action@v6 - # with: - # context: repository - # platforms: linux/amd64,linux/arm64 - # build-args: | - # "VERSION=${{ env.VERSION }}" - # "REVISION=${{ github.sha }}" - # push: true - # labels: ${{ steps.meta.outputs.labels }} - # tags: | - # # ${{ env.HARBOR_URL }}/${{ env.HARBOR_REPO }}:${{ env.VERSION }} - - # - name: Build alpine container images - # uses: docker/build-push-action@v6 - # with: - # context: repository - # platforms: linux/amd64,linux/arm64 - # build-args: | - # "VERSION=${{ env.VERSION }}" - # "REVISION=${{ github.sha }}" - # target: alpine - # push: true - # labels: ${{ steps.meta.outputs.labels }} - # tags: | - # # ${{ env.HARBOR_URL }}/${{ env.HARBOR_REPO }}:${{ env.VERSION }}-alpine - - # e2e_install: - # name: Tests e2e on K8s (Fresh install) - # needs: - # - build - # runs-on: ubuntu-22.04 - # env: - # VERSION: ${{ github.run_id }} - # HARBOR_IMAGE: "harbor.enix.io/kube-image-keeper/kube-image-keeper" - # HARBOR_REGISTRY: "harbor.enix.io" - # HARBOR_USERNAME: ${{ secrets.HARBOR_USERNAME }} - # HARBOR_PASSWORD: ${{ secrets.HARBOR_PASSWORD }} - # strategy: - # max-parallel: 6 - # matrix: - # k8sversion: ["v1.24.17", "v1.25.16", "v1.26.14", "v1.27.11", "v1.28.7", "v1.29.2"] - # steps: - # - name: Checkout Repository - # uses: actions/checkout@v4 - - # - name: Setup KinD - # uses: helm/kind-action@v1.10.0 - # with: - # node_image: kindest/node:${{ matrix.k8sversion }} - - # - name: Run cert-manager installation - # run: | - # kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.11.0/cert-manager.yaml - # kubectl wait pods -n cert-manager -l app.kubernetes.io/instance=cert-manager --for condition=Ready --timeout=90s - - # - name: Set up chart-testing - # uses: helm/chart-testing-action@v2.6.1 - - # - name: Set up helm - # uses: azure/setup-helm@v4 - # with: - # version: '3.9.0' - - # - name: Run chart-testing (lint) - # run: | - # set -euo pipefail - # ct lint \ - # --charts helm/kube-image-keeper \ - # --chart-repos bitnami=https://charts.bitnami.com/bitnami \ - # --validate-maintainers=false --check-version-increment=false - - # - name: Run helm (install) - # run : | - # set -euo pipefail - # kubectl create namespace kuik-system - # kubectl create secret docker-registry harbor-secret -n kuik-system --docker-server=${{ env.HARBOR_REGISTRY }} \ - # --docker-username="$HARBOR_USERNAME" --docker-password="$HARBOR_PASSWORD" - # helm upgrade --install kube-image-keeper -n kuik-system --create-namespace ./helm/kube-image-keeper \ - # --set controllers.image.tag=$VERSION --set proxy.image.tag=$VERSION \ - # --set controllers.image.repository=$HARBOR_IMAGE --set proxy.image.repository=$HARBOR_IMAGE \ - # --set controllers.imagePullSecrets[0].name=harbor-secret --set proxy.image.imagePullSecrets[0].name=harbor-secret --debug - # kubectl wait pods -n kuik-system -l app.kubernetes.io/instance=kube-image-keeper --for condition=Ready --timeout=90s - # helm history kube-image-keeper -n kuik-system - - # - name: Deploy test container - # run: | - # set -euo pipefail - # kubectl create deploy nginx --image=nginx:stable-alpine --replicas=2 - # kubectl rollout status deploy nginx - # kubectl wait deployment nginx --for condition=Available=True --timeout=30s - # echo "kubectl get cachedimage" - # kubectl get cachedimages - # echo "kubectl get repository" - # kubectl get repository - - # - name: Test cachedimage (CRD) - # run: | - # set -euo pipefail - # ## Check if our test image is cached - # if [ $(kubectl get cachedimages docker.io-library-nginx-stable-alpine -o json | jq ".status.isCached") ]; - # then - # if [ $(kubectl get cachedimages docker.io-library-nginx-stable-alpine -o json | jq ".status.usedBy.count") -eq 2 ]; - # then - # echo "Found cached image used by 2 pods" - # else - # echo "Error: pods count should be equal 2" - # exit 1 - # fi - # else - # echo "Error: image cached status is false" - # exit 1 - # fi - - # - name: Test repository (CRD) - # run: | - # set -euo pipefail - # ## Check repository status - # if [ $(kubectl get repository docker.io-library-nginx -o json | jq '.status.phase') == '"Ready"' ] ; - # then - # echo "Found repository" - # else - # echo "Error: image repository status is not Ready" - # exit 1 - # fi - - # - name: Test metrics endpoint - # run: | - # set -euo pipefail - # ## Check for kuik's components metrics - # for component in proxy controllers - # do - # echo "Testing $component metrics endpoint" - # for ip in $(kubectl get po -l "app.kubernetes.io/component=$component" -n kuik-system -o jsonpath='{range .items[*]}{.status.podIP}{"\n"}{end}') - # do - # attempts=0 - # success=false - # while [[ $attempts -lt 3 && $success == false ]] - # do - # response=$(kubectl run curl-pod --image=curlimages/curl --rm -ti --quiet --restart=Never -- curl -s -o /dev/null -w "%{http_code}\n" http://$ip:8080/metrics) - # if [[ -z "$response" ]]; then - # echo "No HTTP response received from $ip" - # elif [[ $response -ge 200 && $response -lt 300 ]]; then - # echo "HTTP status code $response is valid for $ip" - # success=true - # else - # echo "HTTP status code $response is not valid for $ip" - # fi - # attempts=$(( $attempts + 1 )) - # sleep 3 - # done - # if [[ $success == false ]]; then - # echo "Failed after 3 attempts for $ip" - # exit 1 - # fi - # done - # done - - # e2e_upgrade: - # name: Tests e2e on K8s (Upgrade) - # needs: - # - build - # - e2e_install - # runs-on: ubuntu-22.04 - # env: - # VERSION: ${{ github.run_id }} - # HARBOR_IMAGE: "harbor.enix.io/kube-image-keeper/kube-image-keeper" - # HARBOR_REGISTRY: "harbor.enix.io" - # HARBOR_USERNAME: ${{ secrets.HARBOR_USERNAME }} - # HARBOR_PASSWORD: ${{ secrets.HARBOR_PASSWORD }} - # strategy: - # max-parallel: 6 - # matrix: - # k8sversion: ["v1.24.17", "v1.25.16", "v1.26.14", "v1.27.11", "v1.28.7", "v1.29.2"] - # steps: - # - name: Checkout Repository - # uses: actions/checkout@v4 - - # - name: Setup KinD - # uses: helm/kind-action@v1.10.0 - # with: - # node_image: kindest/node:${{ matrix.k8sversion }} - - # - name: Run cert-manager installation - # run: | - # kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.11.0/cert-manager.yaml - # kubectl wait pods -n cert-manager -l app.kubernetes.io/instance=cert-manager --for condition=Ready --timeout=30s - - # - name: Set up chart-testing - # uses: helm/chart-testing-action@v2.6.1 - - # - name: Set up helm - # uses: azure/setup-helm@v4 - # with: - # version: '3.9.0' - - # - name: Run chart-testing (lint) - # run: | - # set -euo pipefail - # ct lint \ - # --charts helm/kube-image-keeper \ - # --chart-repos bitnami=https://charts.bitnami.com/bitnami \ - # --validate-maintainers=false --check-version-increment=false - - # - name: Run helm (install latest release) - # run : | - # set -euo pipefail - # helm repo add enix https://charts.enix.io/ - # helm repo update - # helm upgrade --install kube-image-keeper -n kuik-system --create-namespace enix/kube-image-keeper --debug - # kubectl wait pods -n kuik-system -l app.kubernetes.io/instance=kube-image-keeper --for condition=Ready --timeout=30s - # kubectl get po -n kuik-system - - # - name: Run helm (upgrade) - # run : | - # set -euo pipefail - # kubectl create secret docker-registry harbor-secret -n kuik-system --docker-server=${{ env.HARBOR_REGISTRY }} \ - # --docker-username="$HARBOR_USERNAME" --docker-password="$HARBOR_PASSWORD" - # helm upgrade --install kube-image-keeper -n kuik-system --create-namespace ./helm/kube-image-keeper \ - # --set controllers.image.tag=$VERSION --set proxy.image.tag=$VERSION \ - # --set controllers.image.repository=$HARBOR_IMAGE --set proxy.image.repository=$HARBOR_IMAGE \ - # --set controllers.imagePullSecrets[0].name=harbor-secret --set proxy.image.imagePullSecrets[0].name=harbor-secret --wait --debug - # kubectl rollout status deploy kube-image-keeper-controllers -n kuik-system - # kubectl rollout status ds kube-image-keeper-proxy -n kuik-system - # helm history kube-image-keeper -n kuik-system - - # - name: Deploy test container - # run: | - # set -euo pipefail - # kubectl create deploy nginx --image=nginx:stable-alpine --replicas=2 - # kubectl rollout status deploy nginx - # kubectl wait deployment nginx --for condition=Available=True --timeout=30s - # echo "kubectl get cachedimage" - # kubectl get cachedimages - # echo "kubectl get repository" - # kubectl get repository - - # - name: Test cachedimage (CRD) - # run: | - # set -euo pipefail - # ## Check if our test image is cached - # if [ $(kubectl get cachedimages docker.io-library-nginx-stable-alpine -o json | jq ".status.isCached") ]; - # then - # if [ $(kubectl get cachedimages docker.io-library-nginx-stable-alpine -o json | jq ".status.usedBy.count") -eq 2 ]; - # then - # echo "Found cached image used by 2 pods" - # else - # echo "Error: pods count should be equal 2" - # exit 1 - # fi - # else - # echo "Error: image cached status is false" - # exit 1 - # fi - - # - name: Test repository (CRD) - # run: | - # set -euo pipefail - # ## Check repository status - # if [ $(kubectl get repository docker.io-library-nginx -o json | jq '.status.phase') == '"Ready"' ] ; - # then - # echo "Found repository" - # else - # echo "Error: image repository status is not Ready" - # exit 1 - # fi - - # - name: Test metrics endpoint - # run: | - # set -euo pipefail - # ## Check for kuik's components metrics - # for component in proxy controllers - # do - # echo "Testing $component metrics endpoint" - # for ip in $(kubectl get po -l "app.kubernetes.io/component=$component" -n kuik-system -o jsonpath='{range .items[*]}{.status.podIP}{"\n"}{end}') - # do - # attempts=0 - # success=false - # while [[ $attempts -lt 3 && $success == false ]] - # do - # response=$(kubectl run curl-pod --image=curlimages/curl --rm -ti --quiet --restart=Never -- curl -s -o /dev/null -w "%{http_code}\n" http://$ip:8080/metrics) - # if [[ -z "$response" ]]; then - # echo "No HTTP response received from $ip" - # elif [[ $response -ge 200 && $response -lt 300 ]]; then - # echo "HTTP status code $response is valid for $ip" - # success=true - # else - # echo "HTTP status code $response is not valid for $ip" - # fi - # attempts=$(( $attempts + 1 )) - # sleep 3 - # done - # if [[ $success == false ]]; then - # echo "Failed after 3 attempts for $ip" - # exit 1 - # fi - # done - # done + build: + name: Build test image + needs: + - semver + - tests + runs-on: ubuntu-22.04 + env: + VERSION: ${{ github.run_id }} + HARBOR_URL: "harbor.enix.io" + HARBOR_REPO: "kube-image-keeper/kube-image-keeper" + GHCR_IMAGE: "ghcr.io/enix/kube-image-keeper" + QUAY_IMAGE: "quay.io/enix/kube-image-keeper" + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + with: + path: repository + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to the Container registry + uses: docker/login-action@v3 + with: + registry: ${{ env.HARBOR_URL }} + username: ${{ secrets.HARBOR_USERNAME }} + password: ${{ secrets.HARBOR_PASSWORD }} + + - name: Generate image metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: | + ${{ env.GHCR_IMAGE }} + ${{ github.repository }} + ${{ env.QUAY_IMAGE }} + + - name: Build container images + uses: docker/build-push-action@v6 + with: + context: repository + platforms: linux/amd64,linux/arm64 + build-args: | + "VERSION=${{ env.VERSION }}" + "REVISION=${{ github.sha }}" + push: true + labels: ${{ steps.meta.outputs.labels }} + tags: | + ${{ env.HARBOR_URL }}/${{ env.HARBOR_REPO }}:${{ env.VERSION }} + + - name: Build alpine container images + uses: docker/build-push-action@v6 + with: + context: repository + platforms: linux/amd64,linux/arm64 + build-args: | + "VERSION=${{ env.VERSION }}" + "REVISION=${{ github.sha }}" + target: alpine + push: true + labels: ${{ steps.meta.outputs.labels }} + tags: | + ${{ env.HARBOR_URL }}/${{ env.HARBOR_REPO }}:${{ env.VERSION }}-alpine + + e2e_install: + name: Tests e2e on K8s (Fresh install) + needs: + - build + runs-on: ubuntu-22.04 + env: + VERSION: ${{ github.run_id }} + HARBOR_IMAGE: "harbor.enix.io/kube-image-keeper/kube-image-keeper" + HARBOR_REGISTRY: "harbor.enix.io" + HARBOR_USERNAME: ${{ secrets.HARBOR_USERNAME }} + HARBOR_PASSWORD: ${{ secrets.HARBOR_PASSWORD }} + strategy: + max-parallel: 6 + matrix: + k8sversion: ["v1.24.17", "v1.25.16", "v1.26.14", "v1.27.11", "v1.28.7", "v1.29.2"] + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Setup KinD + uses: helm/kind-action@v1.10.0 + with: + node_image: kindest/node:${{ matrix.k8sversion }} + + - name: Run cert-manager installation + run: | + kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.11.0/cert-manager.yaml + kubectl wait pods -n cert-manager -l app.kubernetes.io/instance=cert-manager --for condition=Ready --timeout=90s + + - name: Set up chart-testing + uses: helm/chart-testing-action@v2.6.1 + + - name: Set up helm + uses: azure/setup-helm@v4 + with: + version: '3.9.0' + + - name: Run chart-testing (lint) + run: | + set -euo pipefail + ct lint \ + --charts helm/kube-image-keeper \ + --chart-repos bitnami=https://charts.bitnami.com/bitnami \ + --validate-maintainers=false --check-version-increment=false + + - name: Run helm (install) + run : | + set -euo pipefail + kubectl create namespace kuik-system + kubectl create secret docker-registry harbor-secret -n kuik-system --docker-server=${{ env.HARBOR_REGISTRY }} \ + --docker-username="$HARBOR_USERNAME" --docker-password="$HARBOR_PASSWORD" + helm upgrade --install kube-image-keeper -n kuik-system --create-namespace ./helm/kube-image-keeper \ + --set controllers.image.tag=$VERSION --set proxy.image.tag=$VERSION \ + --set controllers.image.repository=$HARBOR_IMAGE --set proxy.image.repository=$HARBOR_IMAGE \ + --set controllers.imagePullSecrets[0].name=harbor-secret --set proxy.image.imagePullSecrets[0].name=harbor-secret --debug + kubectl wait pods -n kuik-system -l app.kubernetes.io/instance=kube-image-keeper --for condition=Ready --timeout=90s + helm history kube-image-keeper -n kuik-system + + - name: Deploy test container + run: | + set -euo pipefail + kubectl create deploy nginx --image=nginx:stable-alpine --replicas=2 + kubectl rollout status deploy nginx + kubectl wait deployment nginx --for condition=Available=True --timeout=30s + echo "kubectl get cachedimage" + kubectl get cachedimages + echo "kubectl get repository" + kubectl get repository + + - name: Test cachedimage (CRD) + run: | + set -euo pipefail + ## Check if our test image is cached + if [ $(kubectl get cachedimages docker.io-library-nginx-stable-alpine -o json | jq ".status.isCached") ]; + then + if [ $(kubectl get cachedimages docker.io-library-nginx-stable-alpine -o json | jq ".status.usedBy.count") -eq 2 ]; + then + echo "Found cached image used by 2 pods" + else + echo "Error: pods count should be equal 2" + exit 1 + fi + else + echo "Error: image cached status is false" + exit 1 + fi + + - name: Test repository (CRD) + run: | + set -euo pipefail + ## Check repository status + if [ $(kubectl get repository docker.io-library-nginx -o json | jq '.status.phase') == '"Ready"' ] ; + then + echo "Found repository" + else + echo "Error: image repository status is not Ready" + exit 1 + fi + + - name: Test metrics endpoint + run: | + set -euo pipefail + ## Check for kuik's components metrics + for component in proxy controllers + do + echo "Testing $component metrics endpoint" + for ip in $(kubectl get po -l "app.kubernetes.io/component=$component" -n kuik-system -o jsonpath='{range .items[*]}{.status.podIP}{"\n"}{end}') + do + attempts=0 + success=false + while [[ $attempts -lt 3 && $success == false ]] + do + response=$(kubectl run curl-pod --image=curlimages/curl --rm -ti --quiet --restart=Never -- curl -s -o /dev/null -w "%{http_code}\n" http://$ip:8080/metrics) + if [[ -z "$response" ]]; then + echo "No HTTP response received from $ip" + elif [[ $response -ge 200 && $response -lt 300 ]]; then + echo "HTTP status code $response is valid for $ip" + success=true + else + echo "HTTP status code $response is not valid for $ip" + fi + attempts=$(( $attempts + 1 )) + sleep 3 + done + if [[ $success == false ]]; then + echo "Failed after 3 attempts for $ip" + exit 1 + fi + done + done + + e2e_upgrade: + name: Tests e2e on K8s (Upgrade) + needs: + - build + - e2e_install + runs-on: ubuntu-22.04 + env: + VERSION: ${{ github.run_id }} + HARBOR_IMAGE: "harbor.enix.io/kube-image-keeper/kube-image-keeper" + HARBOR_REGISTRY: "harbor.enix.io" + HARBOR_USERNAME: ${{ secrets.HARBOR_USERNAME }} + HARBOR_PASSWORD: ${{ secrets.HARBOR_PASSWORD }} + strategy: + max-parallel: 6 + matrix: + k8sversion: ["v1.24.17", "v1.25.16", "v1.26.14", "v1.27.11", "v1.28.7", "v1.29.2"] + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Setup KinD + uses: helm/kind-action@v1.10.0 + with: + node_image: kindest/node:${{ matrix.k8sversion }} + + - name: Run cert-manager installation + run: | + kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.11.0/cert-manager.yaml + kubectl wait pods -n cert-manager -l app.kubernetes.io/instance=cert-manager --for condition=Ready --timeout=30s + + - name: Set up chart-testing + uses: helm/chart-testing-action@v2.6.1 + + - name: Set up helm + uses: azure/setup-helm@v4 + with: + version: '3.9.0' + + - name: Run chart-testing (lint) + run: | + set -euo pipefail + ct lint \ + --charts helm/kube-image-keeper \ + --chart-repos bitnami=https://charts.bitnami.com/bitnami \ + --validate-maintainers=false --check-version-increment=false + + - name: Run helm (install latest release) + run : | + set -euo pipefail + helm repo add enix https://charts.enix.io/ + helm repo update + helm upgrade --install kube-image-keeper -n kuik-system --create-namespace enix/kube-image-keeper --debug + kubectl wait pods -n kuik-system -l app.kubernetes.io/instance=kube-image-keeper --for condition=Ready --timeout=30s + kubectl get po -n kuik-system + + - name: Run helm (upgrade) + run : | + set -euo pipefail + kubectl create secret docker-registry harbor-secret -n kuik-system --docker-server=${{ env.HARBOR_REGISTRY }} \ + --docker-username="$HARBOR_USERNAME" --docker-password="$HARBOR_PASSWORD" + helm upgrade --install kube-image-keeper -n kuik-system --create-namespace ./helm/kube-image-keeper \ + --set controllers.image.tag=$VERSION --set proxy.image.tag=$VERSION \ + --set controllers.image.repository=$HARBOR_IMAGE --set proxy.image.repository=$HARBOR_IMAGE \ + --set controllers.imagePullSecrets[0].name=harbor-secret --set proxy.image.imagePullSecrets[0].name=harbor-secret --wait --debug + kubectl rollout status deploy kube-image-keeper-controllers -n kuik-system + kubectl rollout status ds kube-image-keeper-proxy -n kuik-system + helm history kube-image-keeper -n kuik-system + + - name: Deploy test container + run: | + set -euo pipefail + kubectl create deploy nginx --image=nginx:stable-alpine --replicas=2 + kubectl rollout status deploy nginx + kubectl wait deployment nginx --for condition=Available=True --timeout=30s + echo "kubectl get cachedimage" + kubectl get cachedimages + echo "kubectl get repository" + kubectl get repository + + - name: Test cachedimage (CRD) + run: | + set -euo pipefail + ## Check if our test image is cached + if [ $(kubectl get cachedimages docker.io-library-nginx-stable-alpine -o json | jq ".status.isCached") ]; + then + if [ $(kubectl get cachedimages docker.io-library-nginx-stable-alpine -o json | jq ".status.usedBy.count") -eq 2 ]; + then + echo "Found cached image used by 2 pods" + else + echo "Error: pods count should be equal 2" + exit 1 + fi + else + echo "Error: image cached status is false" + exit 1 + fi + + - name: Test repository (CRD) + run: | + set -euo pipefail + ## Check repository status + if [ $(kubectl get repository docker.io-library-nginx -o json | jq '.status.phase') == '"Ready"' ] ; + then + echo "Found repository" + else + echo "Error: image repository status is not Ready" + exit 1 + fi + + - name: Test metrics endpoint + run: | + set -euo pipefail + ## Check for kuik's components metrics + for component in proxy controllers + do + echo "Testing $component metrics endpoint" + for ip in $(kubectl get po -l "app.kubernetes.io/component=$component" -n kuik-system -o jsonpath='{range .items[*]}{.status.podIP}{"\n"}{end}') + do + attempts=0 + success=false + while [[ $attempts -lt 3 && $success == false ]] + do + response=$(kubectl run curl-pod --image=curlimages/curl --rm -ti --quiet --restart=Never -- curl -s -o /dev/null -w "%{http_code}\n" http://$ip:8080/metrics) + if [[ -z "$response" ]]; then + echo "No HTTP response received from $ip" + elif [[ $response -ge 200 && $response -lt 300 ]]; then + echo "HTTP status code $response is valid for $ip" + success=true + else + echo "HTTP status code $response is not valid for $ip" + fi + attempts=$(( $attempts + 1 )) + sleep 3 + done + if [[ $success == false ]]; then + echo "Failed after 3 attempts for $ip" + exit 1 + fi + done + done release: name: Release needs: - # - e2e_upgrade - - tests + - e2e_upgrade - semver runs-on: ubuntu-22.04 outputs: @@ -479,8 +477,7 @@ jobs: with: working_directory: repository env: - # GITHUB_TOKEN: ${{ secrets.RELEASE_GITHUB_TOKEN }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.RELEASE_GITHUB_TOKEN }} GIT_COMMITTER_NAME: ${{ env.COMMIT_NAME }} GIT_COMMITTER_EMAIL: ${{ env.COMMIT_EMAIL }} GIT_AUTHOR_NAME: ${{ env.COMMIT_NAME }} @@ -543,8 +540,8 @@ jobs: CR_VERSION: "1.4.1" VERSION: ${{ needs.release.outputs.version }} PRERELEASE: ${{ needs.release.outputs.prerelease }} - # QUAY_IMAGE: "quay.io/enix/kube-image-keeper" - GHCR_IMAGE: "ghcr.io/adisplayname/kube-image-keeper" + QUAY_IMAGE: "quay.io/enix/kube-image-keeper" + GHCR_IMAGE: "ghcr.io/enix/kube-image-keeper" steps: - name: Configure git run: | @@ -599,35 +596,34 @@ jobs: URL='https://github.com/norwoodj/helm-docs/releases/download/v${{ env.HELM_DOCS_VERSION }}/helm-docs_${{ env.HELM_DOCS_VERSION }}_Linux_x86_64.tar.gz' curl -sSL "${URL}" | tar xz -C bin helm-docs - # - name: Login to Docker Hub - # uses: docker/login-action@v3 - # with: - # username: ${{ secrets.DOCKERHUB_USERNAME }} - # password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Login to Docker Hub + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Login to GHCR uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ env.COMMIT_NAME }} - # password: ${{ secrets.RELEASE_GITHUB_TOKEN }} - password: ${{ secrets.GITHUB_TOKEN }} + password: ${{ secrets.RELEASE_GITHUB_TOKEN }} - # - name: Login to Quay.io - # uses: docker/login-action@v3 - # with: - # registry: quay.io - # username: ${{ secrets.QUAY_USERNAME }} - # password: ${{ secrets.QUAY_ROBOT_TOKEN }} + - name: Login to Quay.io + uses: docker/login-action@v3 + with: + registry: quay.io + username: ${{ secrets.QUAY_USERNAME }} + password: ${{ secrets.QUAY_ROBOT_TOKEN }} - name: Generate image metadata id: meta uses: docker/metadata-action@v5 with: images: | + ${{ github.repository }} + ${{ env.QUAY_IMAGE }} ${{ env.GHCR_IMAGE }} - # ${{ github.repository }} - # ${{ env.QUAY_IMAGE }} - name: Build container images uses: docker/build-push-action@v6 @@ -640,9 +636,9 @@ jobs: push: false labels: ${{ steps.meta.outputs.labels }} tags: | + ${{ github.repository }}:${{ env.VERSION }} + ${{ env.QUAY_IMAGE }}:${{ env.VERSION }} ${{ env.GHCR_IMAGE }}:${{ env.VERSION }} - # ${{ github.repository }}:${{ env.VERSION }} - # ${{ env.QUAY_IMAGE }}:${{ env.VERSION }} - name: Push container images tag (Latest) uses: docker/build-push-action@v6 @@ -656,9 +652,9 @@ jobs: push: true labels: ${{ steps.meta.outputs.labels }} tags: | + ${{ github.repository }}:latest + ${{ env.QUAY_IMAGE }}:latest ${{ env.GHCR_IMAGE }}:latest - # ${{ github.repository }}:latest - # ${{ env.QUAY_IMAGE }}:latest - name: Push container images tag (Release) uses: docker/build-push-action@v6 @@ -671,9 +667,9 @@ jobs: push: true labels: ${{ steps.meta.outputs.labels }} tags: | + ${{ github.repository }}:${{ env.VERSION }} + ${{ env.QUAY_IMAGE }}:${{ env.VERSION }} ${{ env.GHCR_IMAGE }}:${{ env.VERSION }} - # ${{ github.repository }}:${{ env.VERSION }} - # ${{ env.QUAY_IMAGE }}:${{ env.VERSION }} - name: Push alpine container images tag (Release) uses: docker/build-push-action@v6 @@ -687,9 +683,9 @@ jobs: push: true labels: ${{ steps.meta.outputs.labels }} tags: | + ${{ github.repository }}:${{ env.VERSION }}-alpine + ${{ env.QUAY_IMAGE }}:${{ env.VERSION }}-alpine ${{ env.GHCR_IMAGE }}:${{ env.VERSION }}-alpine - # ${{ github.repository }}:${{ env.VERSION }}-alpine - # ${{ env.QUAY_IMAGE }}:${{ env.VERSION }}-alpine - name: Convert Github changelog for Artifacthub shell: python @@ -865,8 +861,8 @@ jobs: header('release the chart') action('clone helm charts repository') - charts_repo = os.path.join(os.environ['WORKSPACE'], 'adisplayname-charts') - run('git', 'clone', 'https://github.com/adisplayname/helm-charts', charts_repo) + charts_repo = os.path.join(os.environ['WORKSPACE'], 'enix-charts') + run('git', 'clone', 'https://github.com/enix/helm-charts', charts_repo) action('copy chart files') repo_chart_path = os.path.join(charts_repo, 'charts', os.environ['CHART_NAME']) @@ -876,10 +872,10 @@ jobs: run(os.environ['CR_PATH'], 'package', repo_chart_path, cwd=charts_repo) action('upload the chart') - run(os.environ['CR_PATH'], 'upload', '--skip-existing', '--owner', 'adisplayname', '--git-repo', 'helm-charts', cwd=charts_repo) + run(os.environ['CR_PATH'], 'upload', '--skip-existing', '--owner', 'enix', '--git-repo', 'helm-charts', cwd=charts_repo) action('update repository index') - run(os.environ['CR_PATH'], 'index', '--push', '-i', 'index.yaml', '--owner', 'adisplayname', '--git-repo', 'helm-charts', '--pages-index-path','charts', cwd=charts_repo) + run(os.environ['CR_PATH'], 'index', '--push', '-i', 'index.yaml', '--owner', 'enix', '--git-repo', 'helm-charts', cwd=charts_repo) cleanup: name: Cleanup @@ -891,4 +887,4 @@ jobs: - name: Delete assets artifact uses: geekyeggo/delete-artifact@v5 with: - name: binaries + name: binaries \ No newline at end of file diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index d45efa5b..1d3095da 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -13,10 +13,10 @@ jobs: runs-on: ubuntu-22.04 env: VERSION: ${{ github.run_id }} - GHCR_IMAGE: "ghcr.io/adisplayname/kube-image-keeper" - # HARBOR_URL: "harbor.enix.io" - # HARBOR_REPO: "kube-image-keeper/kube-image-keeper" - # QUAY_IMAGE: "quay.io/adisplayname/kube-image-keeper" + HARBOR_URL: "harbor.enix.io" + HARBOR_REPO: "kube-image-keeper/kube-image-keeper" + GHCR_IMAGE: "ghcr.io/enix/kube-image-keeper" + QUAY_IMAGE: "quay.io/enix/kube-image-keeper" steps: - name: Checkout Repository uses: actions/checkout@v4 @@ -373,5 +373,4 @@ jobs: exit 1 fi done - done - + done \ No newline at end of file From 7534ab061afd4c008621dcfbb33c598e63b56fa2 Mon Sep 17 00:00:00 2001 From: aDisplayName Date: Mon, 26 Aug 2024 15:19:15 -0500 Subject: [PATCH 25/33] Add missing newlines --- .github/workflows/pr-code.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/tests.yaml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pr-code.yml b/.github/workflows/pr-code.yml index f10f2173..d43c5764 100644 --- a/.github/workflows/pr-code.yml +++ b/.github/workflows/pr-code.yml @@ -74,4 +74,4 @@ jobs: uses: actions/upload-artifact@v4 with: name: code-coverage-report-${{ matrix.kubernetes-version }} - path: coverage.html \ No newline at end of file + path: coverage. diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d3d0fa8b..78dc6e54 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -887,4 +887,4 @@ jobs: - name: Delete assets artifact uses: geekyeggo/delete-artifact@v5 with: - name: binaries \ No newline at end of file + name: binaries diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 1d3095da..f93f3bd1 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -373,4 +373,4 @@ jobs: exit 1 fi done - done \ No newline at end of file + done From 6a86186474162fad29fc92333317e275995efc86 Mon Sep 17 00:00:00 2001 From: aDisplayName Date: Mon, 26 Aug 2024 15:19:56 -0500 Subject: [PATCH 26/33] bug --- .github/workflows/pr-code.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr-code.yml b/.github/workflows/pr-code.yml index d43c5764..1781f980 100644 --- a/.github/workflows/pr-code.yml +++ b/.github/workflows/pr-code.yml @@ -74,4 +74,4 @@ jobs: uses: actions/upload-artifact@v4 with: name: code-coverage-report-${{ matrix.kubernetes-version }} - path: coverage. + path: coverage.html From 2c53c69f3503f604679122bdb671b62593ff5179 Mon Sep 17 00:00:00 2001 From: aDisplayName Date: Mon, 26 Aug 2024 15:20:49 -0500 Subject: [PATCH 27/33] revert back change on release.json --- .releaserc.json | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.releaserc.json b/.releaserc.json index bfdb2409..c22c68d1 100644 --- a/.releaserc.json +++ b/.releaserc.json @@ -11,8 +11,6 @@ [ "@semantic-release/github", { - "successComment": false, - "failTitle": false, "assets": [ "CHANGELOG.md", "../assets/*" @@ -25,10 +23,6 @@ "name": "main", "prerelease": "beta" }, - { - "name": "develop", - "prerelease": "alpha" - }, { "name": "release" } From a8c33b4eb15b082c5452688fce1868b1a7c81dc8 Mon Sep 17 00:00:00 2001 From: aDisplayName Date: Mon, 26 Aug 2024 15:23:06 -0500 Subject: [PATCH 28/33] revert --- Dockerfile | 6 +++--- README.md | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Dockerfile b/Dockerfile index 9cfc03c3..8edff9c8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -27,9 +27,9 @@ ENV CGO_ENABLED=0 GOOS=${TARGETOS} GOARCH=${TARGETARCH} ARG VERSION ARG REVISION ENV LD_FLAGS="\ - -X 'github.com/adisplayname/kube-image-keeper/internal/metrics.Version=${VERSION}' \ - -X 'github.com/adisplayname/kube-image-keeper/internal/metrics.Revision=${REVISION}' \ - -X 'github.com/adisplayname/kube-image-keeper/internal/metrics.BuildDateTime=BUILD_DATE_TIME'" + -X 'github.com/enix/kube-image-keeper/internal/metrics.Version=${VERSION}' \ + -X 'github.com/enix/kube-image-keeper/internal/metrics.Revision=${REVISION}' \ + -X 'github.com/enix/kube-image-keeper/internal/metrics.BuildDateTime=BUILD_DATE_TIME'" RUN --mount=type=cache,target="/root/.cache/go-build" \ BUILD_DATE_TIME=$(date -u +"%Y-%m-%dT%H:%M:%S") && \ diff --git a/README.md b/README.md index 83800d05..3b300bbd 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ It saves the container images used by your pods in its own local registry so tha ## Upgrading ### From 1.6.0 o 1.7.0 - + ***ACTION REQUIRED*** To follow Helm3 best pratices, we moved `cachedimage` and `repository` custom resources definition from the helm templates directory to the dedicated `crds` directory. @@ -160,7 +160,7 @@ You can use Helm to generate plain YAML files and then deploy these YAML files w ```bash helm template --namespace kuik-system \ kube-image-keeper kube-image-keeper \ - --repo https://adisplayname.github.io/helm-charts/charts \ + --repo https://charts.enix.io/ \ > /tmp/kuik.yaml kubectl create namespace kuik-system kubectl apply -f /tmp/kuik.yaml --namespace kuik-system @@ -178,7 +178,7 @@ For instance, to extend the expiration delay to 3 months (90 days), you can depl helm upgrade --install \ --create-namespace --namespace kuik-system \ kube-image-keeper kube-image-keeper \ - --repo https://adisplayname.github.io/helm-charts/charts \ + --repo https://charts.enix.io/ \ --set cachedImagesExpiryDelay=90 ``` From bbc4a43d2e5b166293b50ed3e37925f0e23818ce Mon Sep 17 00:00:00 2001 From: aDisplayName Date: Mon, 26 Aug 2024 15:25:15 -0500 Subject: [PATCH 29/33] revert --- .github/workflows/tests.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index f93f3bd1..0315e64e 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -374,3 +374,4 @@ jobs: fi done done + From 9e1d05861738f336105850e4b6a582c4cfba6c82 Mon Sep 17 00:00:00 2001 From: aDisplayName Date: Mon, 26 Aug 2024 15:34:00 -0500 Subject: [PATCH 30/33] Revert to original branding --- api/core/v1/pod_webhook.go | 4 +- api/core/v1/pod_webhook_test.go | 4 +- api/kuik/v1alpha1ext1/cachedimage_utils.go | 2 +- api/kuik/v1alpha1ext1/cachedimage_webhook.go | 2 +- api/kuik/v1alpha1ext1/repository_utils.go | 2 +- cmd/cache/main.go | 16 ++--- cmd/proxy/main.go | 8 +-- go.mod | 2 +- helm/kube-image-keeper/values.yaml | 4 +- internal/controller/collector.go | 4 +- internal/controller/core/pod_controller.go | 4 +- .../controller/core/pod_controller_test.go | 4 +- internal/controller/core/suite_test.go | 2 +- .../controller/kuik/cachedimage_controller.go | 8 +-- .../kuik/cachedimage_controller_test.go | 2 +- .../controller/kuik/repository_controller.go | 6 +- internal/controller/kuik/suite_test.go | 4 +- internal/proxy/collector.go | 2 +- internal/proxy/server.go | 6 +- internal/registry/test_test.go | 69 ------------------- internal/scheme/scheme.go | 2 +- 21 files changed, 44 insertions(+), 113 deletions(-) delete mode 100644 internal/registry/test_test.go diff --git a/api/core/v1/pod_webhook.go b/api/core/v1/pod_webhook.go index 034ea81c..9a3ae133 100644 --- a/api/core/v1/pod_webhook.go +++ b/api/core/v1/pod_webhook.go @@ -11,8 +11,8 @@ import ( _ "crypto/sha256" - "github.com/adisplayname/kube-image-keeper/internal/controller/core" - "github.com/adisplayname/kube-image-keeper/internal/registry" + "github.com/enix/kube-image-keeper/internal/controller/core" + "github.com/enix/kube-image-keeper/internal/registry" "github.com/google/go-containerregistry/pkg/name" admissionv1 "k8s.io/api/admission/v1" corev1 "k8s.io/api/core/v1" diff --git a/api/core/v1/pod_webhook_test.go b/api/core/v1/pod_webhook_test.go index 376f6b2b..a058d18b 100644 --- a/api/core/v1/pod_webhook_test.go +++ b/api/core/v1/pod_webhook_test.go @@ -6,8 +6,8 @@ import ( "regexp" "testing" - "github.com/adisplayname/kube-image-keeper/internal/controller/core" - "github.com/adisplayname/kube-image-keeper/internal/registry" + "github.com/enix/kube-image-keeper/internal/controller/core" + "github.com/enix/kube-image-keeper/internal/registry" . "github.com/onsi/gomega" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" diff --git a/api/kuik/v1alpha1ext1/cachedimage_utils.go b/api/kuik/v1alpha1ext1/cachedimage_utils.go index 9cd13951..b27669ed 100644 --- a/api/kuik/v1alpha1ext1/cachedimage_utils.go +++ b/api/kuik/v1alpha1ext1/cachedimage_utils.go @@ -3,8 +3,8 @@ package v1alpha1ext1 import ( "context" - "github.com/adisplayname/kube-image-keeper/internal/registry" "github.com/distribution/reference" + "github.com/enix/kube-image-keeper/internal/registry" corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/types" diff --git a/api/kuik/v1alpha1ext1/cachedimage_webhook.go b/api/kuik/v1alpha1ext1/cachedimage_webhook.go index 1f5590b9..39012b91 100644 --- a/api/kuik/v1alpha1ext1/cachedimage_webhook.go +++ b/api/kuik/v1alpha1ext1/cachedimage_webhook.go @@ -3,8 +3,8 @@ package v1alpha1ext1 import ( "context" - "github.com/adisplayname/kube-image-keeper/internal/registry" "github.com/distribution/reference" + "github.com/enix/kube-image-keeper/internal/registry" runtime "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/validation/field" ctrl "sigs.k8s.io/controller-runtime" diff --git a/api/kuik/v1alpha1ext1/repository_utils.go b/api/kuik/v1alpha1ext1/repository_utils.go index 14a142eb..7eb05fea 100644 --- a/api/kuik/v1alpha1ext1/repository_utils.go +++ b/api/kuik/v1alpha1ext1/repository_utils.go @@ -3,7 +3,7 @@ package v1alpha1ext1 import ( "regexp" - "github.com/adisplayname/kube-image-keeper/internal/registry" + "github.com/enix/kube-image-keeper/internal/registry" corev1 "k8s.io/api/core/v1" "sigs.k8s.io/controller-runtime/pkg/client" ) diff --git a/cmd/cache/main.go b/cmd/cache/main.go index fc046521..52778baa 100644 --- a/cmd/cache/main.go +++ b/cmd/cache/main.go @@ -17,14 +17,14 @@ import ( "sigs.k8s.io/controller-runtime/pkg/webhook" "sigs.k8s.io/controller-runtime/pkg/webhook/admission" - kuikenixiov1 "github.com/adisplayname/kube-image-keeper/api/core/v1" - kuikv1alpha1 "github.com/adisplayname/kube-image-keeper/api/kuik/v1alpha1ext1" - "github.com/adisplayname/kube-image-keeper/internal" - kuikController "github.com/adisplayname/kube-image-keeper/internal/controller" - "github.com/adisplayname/kube-image-keeper/internal/controller/core" - "github.com/adisplayname/kube-image-keeper/internal/controller/kuik" - "github.com/adisplayname/kube-image-keeper/internal/registry" - "github.com/adisplayname/kube-image-keeper/internal/scheme" + kuikenixiov1 "github.com/enix/kube-image-keeper/api/core/v1" + kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" + "github.com/enix/kube-image-keeper/internal" + kuikController "github.com/enix/kube-image-keeper/internal/controller" + "github.com/enix/kube-image-keeper/internal/controller/core" + "github.com/enix/kube-image-keeper/internal/controller/kuik" + "github.com/enix/kube-image-keeper/internal/registry" + "github.com/enix/kube-image-keeper/internal/scheme" //+kubebuilder:scaffold:imports ) diff --git a/cmd/proxy/main.go b/cmd/proxy/main.go index 71f76436..7652bb28 100644 --- a/cmd/proxy/main.go +++ b/cmd/proxy/main.go @@ -7,10 +7,10 @@ import ( _ "go.uber.org/automaxprocs" - "github.com/adisplayname/kube-image-keeper/internal" - "github.com/adisplayname/kube-image-keeper/internal/proxy" - "github.com/adisplayname/kube-image-keeper/internal/registry" - "github.com/adisplayname/kube-image-keeper/internal/scheme" + "github.com/enix/kube-image-keeper/internal" + "github.com/enix/kube-image-keeper/internal/proxy" + "github.com/enix/kube-image-keeper/internal/registry" + "github.com/enix/kube-image-keeper/internal/scheme" "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/util/flowcontrol" diff --git a/go.mod b/go.mod index 7466b011..13407927 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module github.com/adisplayname/kube-image-keeper +module github.com/enix/kube-image-keeper go 1.22 diff --git a/helm/kube-image-keeper/values.yaml b/helm/kube-image-keeper/values.yaml index 3145eba0..939cde73 100644 --- a/helm/kube-image-keeper/values.yaml +++ b/helm/kube-image-keeper/values.yaml @@ -20,7 +20,7 @@ controllers: replicas: 2 image: # -- Controller image repository. Also available: `quay.io/enix/kube-image-keeper` - repository: ghcr.io/adisplayname/kube-image-keeper + repository: ghcr.io/enix/kube-image-keeper # -- Controller image pull policy pullPolicy: IfNotPresent # -- Controller image tag. Default chart appVersion @@ -104,7 +104,7 @@ controllers: proxy: image: # -- Proxy image repository. Also available: `quay.io/enix/kube-image-keeper` - repository: ghcr.io/adisplayname/kube-image-keeper + repository: ghcr.io/enix/kube-image-keeper # -- Proxy image pull policy pullPolicy: IfNotPresent # -- Proxy image tag. Default chart appVersion diff --git a/internal/controller/collector.go b/internal/controller/collector.go index 3b4f7cc9..30f510a0 100644 --- a/internal/controller/collector.go +++ b/internal/controller/collector.go @@ -4,8 +4,8 @@ import ( "context" "strconv" - kuikv1alpha1 "github.com/adisplayname/kube-image-keeper/api/kuik/v1alpha1ext1" - kuikMetrics "github.com/adisplayname/kube-image-keeper/internal/metrics" + kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" + kuikMetrics "github.com/enix/kube-image-keeper/internal/metrics" "github.com/prometheus/client_golang/prometheus" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/log" diff --git a/internal/controller/core/pod_controller.go b/internal/controller/core/pod_controller.go index b8939ee3..6622fa45 100644 --- a/internal/controller/core/pod_controller.go +++ b/internal/controller/core/pod_controller.go @@ -11,9 +11,9 @@ import ( "k8s.io/apimachinery/pkg/selection" "k8s.io/apimachinery/pkg/types" - kuikv1alpha1 "github.com/adisplayname/kube-image-keeper/api/kuik/v1alpha1ext1" - "github.com/adisplayname/kube-image-keeper/internal/registry" "github.com/distribution/reference" + kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" + "github.com/enix/kube-image-keeper/internal/registry" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" diff --git a/internal/controller/core/pod_controller_test.go b/internal/controller/core/pod_controller_test.go index d5194c48..5019df9f 100644 --- a/internal/controller/core/pod_controller_test.go +++ b/internal/controller/core/pod_controller_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - kuikv1alpha1 "github.com/adisplayname/kube-image-keeper/api/kuik/v1alpha1ext1" - "github.com/adisplayname/kube-image-keeper/internal/registry" + kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" + "github.com/enix/kube-image-keeper/internal/registry" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" corev1 "k8s.io/api/core/v1" diff --git a/internal/controller/core/suite_test.go b/internal/controller/core/suite_test.go index 681afeea..8d97b787 100644 --- a/internal/controller/core/suite_test.go +++ b/internal/controller/core/suite_test.go @@ -19,7 +19,7 @@ import ( corev1 "k8s.io/api/core/v1" - kuikv1alpha1 "github.com/adisplayname/kube-image-keeper/api/kuik/v1alpha1ext1" + kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" //+kubebuilder:scaffold:imports ) diff --git a/internal/controller/kuik/cachedimage_controller.go b/internal/controller/kuik/cachedimage_controller.go index 9d8a873c..dfe50806 100644 --- a/internal/controller/kuik/cachedimage_controller.go +++ b/internal/controller/kuik/cachedimage_controller.go @@ -29,10 +29,10 @@ import ( "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/predicate" - kuikv1alpha1 "github.com/adisplayname/kube-image-keeper/api/kuik/v1alpha1ext1" - kuikController "github.com/adisplayname/kube-image-keeper/internal/controller" - "github.com/adisplayname/kube-image-keeper/internal/controller/core" - "github.com/adisplayname/kube-image-keeper/internal/registry" + kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" + kuikController "github.com/enix/kube-image-keeper/internal/controller" + "github.com/enix/kube-image-keeper/internal/controller/core" + "github.com/enix/kube-image-keeper/internal/registry" ) const ( diff --git a/internal/controller/kuik/cachedimage_controller_test.go b/internal/controller/kuik/cachedimage_controller_test.go index 2146aea2..e6a91995 100644 --- a/internal/controller/kuik/cachedimage_controller_test.go +++ b/internal/controller/kuik/cachedimage_controller_test.go @@ -7,7 +7,7 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - kuikv1alpha1 "github.com/adisplayname/kube-image-keeper/api/kuik/v1alpha1ext1" + kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) diff --git a/internal/controller/kuik/repository_controller.go b/internal/controller/kuik/repository_controller.go index ca6eab17..a42a3346 100644 --- a/internal/controller/kuik/repository_controller.go +++ b/internal/controller/kuik/repository_controller.go @@ -20,9 +20,9 @@ import ( "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/predicate" - kuikv1alpha1 "github.com/adisplayname/kube-image-keeper/api/kuik/v1alpha1ext1" - kuikController "github.com/adisplayname/kube-image-keeper/internal/controller" - "github.com/adisplayname/kube-image-keeper/internal/registry" + kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" + kuikController "github.com/enix/kube-image-keeper/internal/controller" + "github.com/enix/kube-image-keeper/internal/registry" ) const ( diff --git a/internal/controller/kuik/suite_test.go b/internal/controller/kuik/suite_test.go index 06e3214a..ead3070f 100644 --- a/internal/controller/kuik/suite_test.go +++ b/internal/controller/kuik/suite_test.go @@ -39,8 +39,8 @@ import ( logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/log/zap" - kuikv1alpha1 "github.com/adisplayname/kube-image-keeper/api/kuik/v1alpha1ext1" - "github.com/adisplayname/kube-image-keeper/internal/registry" + kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" + "github.com/enix/kube-image-keeper/internal/registry" //+kubebuilder:scaffold:imports ) diff --git a/internal/proxy/collector.go b/internal/proxy/collector.go index 96d47a09..b40305bc 100644 --- a/internal/proxy/collector.go +++ b/internal/proxy/collector.go @@ -3,7 +3,7 @@ package proxy import ( "fmt" - "github.com/adisplayname/kube-image-keeper/internal/metrics" + "github.com/enix/kube-image-keeper/internal/metrics" "github.com/prometheus/client_golang/prometheus" ) diff --git a/internal/proxy/server.go b/internal/proxy/server.go index c1840ece..9271ef9d 100644 --- a/internal/proxy/server.go +++ b/internal/proxy/server.go @@ -12,10 +12,10 @@ import ( "regexp" "strings" - kuikv1alpha1 "github.com/adisplayname/kube-image-keeper/api/kuik/v1alpha1ext1" - "github.com/adisplayname/kube-image-keeper/internal/metrics" - "github.com/adisplayname/kube-image-keeper/internal/registry" "github.com/distribution/reference" + kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" + "github.com/enix/kube-image-keeper/internal/metrics" + "github.com/enix/kube-image-keeper/internal/registry" "github.com/gin-gonic/gin" "github.com/google/go-containerregistry/pkg/authn" "github.com/google/go-containerregistry/pkg/name" diff --git a/internal/registry/test_test.go b/internal/registry/test_test.go deleted file mode 100644 index 2f3f8d7e..00000000 --- a/internal/registry/test_test.go +++ /dev/null @@ -1,69 +0,0 @@ -package registry - -/* -import ( - "fmt" - "os" - "testing" - - cranepkg "github.com/google/go-containerregistry/pkg/v1" - "github.com/google/go-containerregistry/pkg/v1/remote" - "github.com/google/go-containerregistry/pkg/v1/tarball" - "github.com/google/go-containerregistry/pkg/v1/types" - v1 "k8s.io/api/core/v1" -) - -// Write remote image to tarball file -func Test_parsing(t *testing.T) { - - sourceImangeName := "mcr.microsoft.com/powershell:lts" - desc, _ := GetDescriptor(sourceImangeName, []v1.Secret{}, []string{}, nil) - destRef, _ := parseLocalReference(sourceImangeName) - // architectures := []string{"amd64"} - switch desc.MediaType { - case types.OCIImageIndex, types.DockerManifestList: - // index, err := desc.ImageIndex() - // if err != nil { - // return - // } - // filteredIndex := mutate.RemoveManifests(index, func(desc cranepkg.Descriptor) bool { - // for _, arch := range architectures { - // if arch == desc.Platform.Architecture { - // return false - // } - // } - // return true - // }) - - // if err := remote.WriteIndex(destRef, filteredIndex); err != nil { - // return - // } - var k = 1 - k = k + 1 - - progressUpdate := make(chan cranepkg.Update, 100) - callback := func(u cranepkg.Update) { - fmt.Print(u.Complete) - } - go func() { - for update := range progressUpdate { - if callback != nil { - callback(update) - } - } - }() - image, err := desc.Image() - if err != nil { - return - } - file, err := os.Create("output.tar") - if err := tarball.Write(destRef, image, file, tarball.WithProgress(progressUpdate)); err != nil { - return - } - - if err := remote.Write(destRef, image, remote.WithProgress(progressUpdate)); err != nil { - return - } - } -} -*/ diff --git a/internal/scheme/scheme.go b/internal/scheme/scheme.go index 4b9b852b..7219a98f 100644 --- a/internal/scheme/scheme.go +++ b/internal/scheme/scheme.go @@ -10,7 +10,7 @@ import ( utilruntime "k8s.io/apimachinery/pkg/util/runtime" clientgoscheme "k8s.io/client-go/kubernetes/scheme" - kuikv1alpha1 "github.com/adisplayname/kube-image-keeper/api/kuik/v1alpha1ext1" + kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" //+kubebuilder:scaffold:imports ) From 24e9eccea78802668ff858b27a219486d096bd33 Mon Sep 17 00:00:00 2001 From: aDisplayName Date: Mon, 26 Aug 2024 15:41:46 -0500 Subject: [PATCH 31/33] rename kuikv1alpha1 to kuikv1alpha1ext1 --- cmd/cache/main.go | 4 +- internal/controller/collector.go | 6 +- internal/controller/core/pod_controller.go | 32 ++++----- .../controller/core/pod_controller_test.go | 22 +++--- internal/controller/core/suite_test.go | 4 +- .../controller/kuik/cachedimage_controller.go | 38 +++++----- .../kuik/cachedimage_controller_test.go | 20 +++--- .../controller/kuik/repository_controller.go | 28 ++++---- internal/controller/kuik/suite_test.go | 4 +- internal/proxy/server.go | 10 +-- internal/registry/test_test.go | 69 +++++++++++++++++++ internal/scheme/scheme.go | 5 +- 12 files changed, 155 insertions(+), 87 deletions(-) create mode 100644 internal/registry/test_test.go diff --git a/cmd/cache/main.go b/cmd/cache/main.go index 52778baa..8311b6cb 100644 --- a/cmd/cache/main.go +++ b/cmd/cache/main.go @@ -18,7 +18,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/webhook/admission" kuikenixiov1 "github.com/enix/kube-image-keeper/api/core/v1" - kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" + kuikv1alpha1ext1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" "github.com/enix/kube-image-keeper/internal" kuikController "github.com/enix/kube-image-keeper/internal/controller" "github.com/enix/kube-image-keeper/internal/controller/core" @@ -116,7 +116,7 @@ func main() { Decoder: admission.NewDecoder(mgr.GetScheme()), } mgr.GetWebhookServer().Register("/mutate-core-v1-pod", &webhook.Admission{Handler: &imageRewriter}) - if err = (&kuikv1alpha1.CachedImage{}).SetupWebhookWithManager(mgr); err != nil { + if err = (&kuikv1alpha1ext1.CachedImage{}).SetupWebhookWithManager(mgr); err != nil { setupLog.Error(err, "unable to create webhook", "webhook", "CachedImage") os.Exit(1) } diff --git a/internal/controller/collector.go b/internal/controller/collector.go index 30f510a0..50227ce9 100644 --- a/internal/controller/collector.go +++ b/internal/controller/collector.go @@ -4,7 +4,7 @@ import ( "context" "strconv" - kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" + kuikv1alpha1ext1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" kuikMetrics "github.com/enix/kube-image-keeper/internal/metrics" "github.com/prometheus/client_golang/prometheus" "sigs.k8s.io/controller-runtime/pkg/client" @@ -70,7 +70,7 @@ func RegisterMetrics(client client.Client) { ) } -func cachedImagesWithLabelValues(gaugeVec *prometheus.GaugeVec, cachedImage *kuikv1alpha1.CachedImage) prometheus.Gauge { +func cachedImagesWithLabelValues(gaugeVec *prometheus.GaugeVec, cachedImage *kuikv1alpha1ext1.CachedImage) prometheus.Gauge { return gaugeVec.WithLabelValues(strconv.FormatBool(cachedImage.Status.IsCached), strconv.FormatBool(cachedImage.Spec.ExpiresAt != nil)) } @@ -83,7 +83,7 @@ func (c *ControllerCollector) Describe(ch chan<- *prometheus.Desc) { } func (c *ControllerCollector) Collect(ch chan<- prometheus.Metric) { - cachedImageList := &kuikv1alpha1.CachedImageList{} + cachedImageList := &kuikv1alpha1ext1.CachedImageList{} if err := c.List(context.Background(), cachedImageList); err == nil { cachedImageGaugeVec := prometheus.NewGaugeVec( prometheus.GaugeOpts{ diff --git a/internal/controller/core/pod_controller.go b/internal/controller/core/pod_controller.go index 6622fa45..1b7820f8 100644 --- a/internal/controller/core/pod_controller.go +++ b/internal/controller/core/pod_controller.go @@ -12,7 +12,7 @@ import ( "k8s.io/apimachinery/pkg/types" "github.com/distribution/reference" - kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" + kuikv1alpha1ext1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" "github.com/enix/kube-image-keeper/internal/registry" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -92,7 +92,7 @@ func (r *PodReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.R } for _, cachedImage := range cachedImages { - var ci kuikv1alpha1.CachedImage + var ci kuikv1alpha1ext1.CachedImage err := r.Get(ctx, client.ObjectKeyFromObject(&cachedImage), &ci) if err != nil && !apierrors.IsNotFound(err) { return ctrl.Result{}, err @@ -141,7 +141,7 @@ func (r *PodReconciler) SetupWithManager(mgr ctrl.Manager) error { return ok }))). Watches( - &kuikv1alpha1.CachedImage{}, + &kuikv1alpha1ext1.CachedImage{}, handler.EnqueueRequestsFromMapFunc(r.podsWithDeletingCachedImages), builder.WithPredicates(p), ). @@ -154,8 +154,8 @@ func (r *PodReconciler) podsWithDeletingCachedImages(ctx context.Context, obj cl WithName("controller-runtime.manager.controller.pod.deletingCachedImages"). WithValues("cachedImage", klog.KObj(obj)) - cachedImage := obj.(*kuikv1alpha1.CachedImage) - var currentCachedImage kuikv1alpha1.CachedImage + cachedImage := obj.(*kuikv1alpha1ext1.CachedImage) + var currentCachedImage kuikv1alpha1ext1.CachedImage // wait for the CachedImage to be really deleted if err := r.Get(ctx, client.ObjectKeyFromObject(cachedImage), ¤tCachedImage); err == nil || !apierrors.IsNotFound(err) { return make([]ctrl.Request, 0) @@ -187,8 +187,8 @@ func (r *PodReconciler) podsWithDeletingCachedImages(ctx context.Context, obj cl return make([]ctrl.Request, 0) } -func (r *PodReconciler) desiredRepositories(ctx context.Context, pod *corev1.Pod, cachedImages []kuikv1alpha1.CachedImage) ([]kuikv1alpha1.Repository, error) { - repositories := map[string]kuikv1alpha1.Repository{} +func (r *PodReconciler) desiredRepositories(ctx context.Context, pod *corev1.Pod, cachedImages []kuikv1alpha1ext1.CachedImage) ([]kuikv1alpha1ext1.Repository, error) { + repositories := map[string]kuikv1alpha1ext1.Repository{} pullSecretNames, err := r.imagePullSecretNamesFromPod(ctx, pod) if err != nil { @@ -201,11 +201,11 @@ func (r *PodReconciler) desiredRepositories(ctx context.Context, pod *corev1.Pod return nil, err } repositoryName := named.Name() - repositories[repositoryName] = kuikv1alpha1.Repository{ + repositories[repositoryName] = kuikv1alpha1ext1.Repository{ ObjectMeta: metav1.ObjectMeta{ Name: registry.SanitizeName(repositoryName), }, - Spec: kuikv1alpha1.RepositorySpec{ + Spec: kuikv1alpha1ext1.RepositorySpec{ Name: repositoryName, PullSecretNames: pullSecretNames, PullSecretsNamespace: pod.Namespace, @@ -216,15 +216,15 @@ func (r *PodReconciler) desiredRepositories(ctx context.Context, pod *corev1.Pod return maps.Values(repositories), nil } -func DesiredCachedImages(ctx context.Context, pod *corev1.Pod) []kuikv1alpha1.CachedImage { +func DesiredCachedImages(ctx context.Context, pod *corev1.Pod) []kuikv1alpha1ext1.CachedImage { cachedImages := desiredCachedImagesForContainers(ctx, pod.Spec.Containers, pod.Annotations, false) cachedImages = append(cachedImages, desiredCachedImagesForContainers(ctx, pod.Spec.InitContainers, pod.Annotations, true)...) return cachedImages } -func desiredCachedImagesForContainers(ctx context.Context, containers []corev1.Container, annotations map[string]string, initContainer bool) []kuikv1alpha1.CachedImage { +func desiredCachedImagesForContainers(ctx context.Context, containers []corev1.Container, annotations map[string]string, initContainer bool) []kuikv1alpha1ext1.CachedImage { log := log.FromContext(ctx) - cachedImages := []kuikv1alpha1.CachedImage{} + cachedImages := []kuikv1alpha1ext1.CachedImage{} for _, container := range containers { annotationKey := registry.ContainerAnnotationKey(container.Name, initContainer) @@ -249,7 +249,7 @@ func desiredCachedImagesForContainers(ctx context.Context, containers []corev1.C return cachedImages } -func cachedImageFromSourceImage(sourceImage string) (*kuikv1alpha1.CachedImage, error) { +func cachedImageFromSourceImage(sourceImage string) (*kuikv1alpha1ext1.CachedImage, error) { ref, err := reference.ParseAnyReference(sourceImage) if err != nil { return nil, err @@ -260,12 +260,12 @@ func cachedImageFromSourceImage(sourceImage string) (*kuikv1alpha1.CachedImage, sanitizedName += "-latest" } - cachedImage := kuikv1alpha1.CachedImage{ - TypeMeta: metav1.TypeMeta{APIVersion: kuikv1alpha1.GroupVersion.String(), Kind: "CachedImage"}, + cachedImage := kuikv1alpha1ext1.CachedImage{ + TypeMeta: metav1.TypeMeta{APIVersion: kuikv1alpha1ext1.GroupVersion.String(), Kind: "CachedImage"}, ObjectMeta: metav1.ObjectMeta{ Name: sanitizedName, }, - Spec: kuikv1alpha1.CachedImageSpec{ + Spec: kuikv1alpha1ext1.CachedImageSpec{ SourceImage: sourceImage, }, } diff --git a/internal/controller/core/pod_controller_test.go b/internal/controller/core/pod_controller_test.go index 5019df9f..2e640730 100644 --- a/internal/controller/core/pod_controller_test.go +++ b/internal/controller/core/pod_controller_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" + kuikv1alpha1ext1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" "github.com/enix/kube-image-keeper/internal/registry" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" @@ -57,19 +57,19 @@ func TestDesiredCachedImages(t *testing.T) { tests := []struct { name string pod corev1.Pod - cachedImages []kuikv1alpha1.CachedImage + cachedImages []kuikv1alpha1ext1.CachedImage }{ { name: "basic", pod: podStub, - cachedImages: []kuikv1alpha1.CachedImage{ - {Spec: kuikv1alpha1.CachedImageSpec{ + cachedImages: []kuikv1alpha1ext1.CachedImage{ + {Spec: kuikv1alpha1ext1.CachedImageSpec{ SourceImage: "nginx", }}, - {Spec: kuikv1alpha1.CachedImageSpec{ + {Spec: kuikv1alpha1ext1.CachedImageSpec{ SourceImage: "busybox", }}, - {Spec: kuikv1alpha1.CachedImageSpec{ + {Spec: kuikv1alpha1ext1.CachedImageSpec{ SourceImage: "alpine", }}, }, @@ -146,7 +146,7 @@ var _ = Describe("Pod Controller", func() { podStubNotRewritten.ResourceVersion = "" By("Deleting all cached images") - Expect(k8sClient.DeleteAllOf(context.Background(), &kuikv1alpha1.CachedImage{})).Should(Succeed()) + Expect(k8sClient.DeleteAllOf(context.Background(), &kuikv1alpha1ext1.CachedImage{})).Should(Succeed()) }) Context("Pod with containers and init containers", func() { @@ -154,8 +154,8 @@ var _ = Describe("Pod Controller", func() { By("Creating a pod") Expect(k8sClient.Create(context.Background(), &podStub)).Should(Succeed()) - fetched := &kuikv1alpha1.CachedImageList{} - Eventually(func() []kuikv1alpha1.CachedImage { + fetched := &kuikv1alpha1ext1.CachedImageList{} + Eventually(func() []kuikv1alpha1ext1.CachedImage { _ = k8sClient.List(context.Background(), fetched) return fetched.Items }, timeout, interval).Should(HaveLen(len(podStub.Spec.Containers) + len(podStub.Spec.InitContainers))) @@ -177,8 +177,8 @@ var _ = Describe("Pod Controller", func() { By("Creating a pod without rewriting images") Expect(k8sClient.Create(context.Background(), &podStubNotRewritten)).Should(Succeed()) - fetched := &kuikv1alpha1.CachedImageList{} - Eventually(func() []kuikv1alpha1.CachedImage { + fetched := &kuikv1alpha1ext1.CachedImageList{} + Eventually(func() []kuikv1alpha1ext1.CachedImage { _ = k8sClient.List(context.Background(), fetched) return fetched.Items }, timeout, interval).Should(HaveLen(0)) diff --git a/internal/controller/core/suite_test.go b/internal/controller/core/suite_test.go index 8d97b787..73c11fac 100644 --- a/internal/controller/core/suite_test.go +++ b/internal/controller/core/suite_test.go @@ -19,7 +19,7 @@ import ( corev1 "k8s.io/api/core/v1" - kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" + kuikv1alpha1ext1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" //+kubebuilder:scaffold:imports ) @@ -55,7 +55,7 @@ var _ = BeforeSuite(func() { Expect(err).NotTo(HaveOccurred()) Expect(cfg).NotTo(BeNil()) - err = kuikv1alpha1.AddToScheme(scheme.Scheme) + err = kuikv1alpha1ext1.AddToScheme(scheme.Scheme) Expect(err).NotTo(HaveOccurred()) err = corev1.AddToScheme(scheme.Scheme) diff --git a/internal/controller/kuik/cachedimage_controller.go b/internal/controller/kuik/cachedimage_controller.go index dfe50806..61c696ee 100644 --- a/internal/controller/kuik/cachedimage_controller.go +++ b/internal/controller/kuik/cachedimage_controller.go @@ -29,7 +29,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/predicate" - kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" + kuikv1alpha1ext1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" kuikController "github.com/enix/kube-image-keeper/internal/controller" "github.com/enix/kube-image-keeper/internal/controller/core" "github.com/enix/kube-image-keeper/internal/registry" @@ -79,7 +79,7 @@ type CachedImageReconciler struct { func (r *CachedImageReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { log := log.FromContext(ctx) - var cachedImage kuikv1alpha1.CachedImage + var cachedImage kuikv1alpha1ext1.CachedImage if err := r.Get(ctx, req.NamespacedName, &cachedImage); err != nil { return ctrl.Result{}, client.IgnoreNotFound(err) } @@ -103,7 +103,7 @@ func (r *CachedImageReconciler) Reconcile(ctx context.Context, req ctrl.Request) } repositoryName := named.Name() - repository := kuikv1alpha1.Repository{ObjectMeta: metav1.ObjectMeta{Name: registry.SanitizeName(repositoryName)}} + repository := kuikv1alpha1ext1.Repository{ObjectMeta: metav1.ObjectMeta{Name: registry.SanitizeName(repositoryName)}} operation, err := controllerutil.CreateOrPatch(ctx, r.Client, &repository, func() error { repository.Spec.Name = repositoryName return nil @@ -115,7 +115,7 @@ func (r *CachedImageReconciler) Reconcile(ctx context.Context, req ctrl.Request) log.Info("repository updated", "repository", klog.KObj(&repository), "operation", operation) // Set owner reference - owner := &kuikv1alpha1.Repository{} + owner := &kuikv1alpha1ext1.Repository{} if err := r.Get(ctx, client.ObjectKeyFromObject(&repository), owner); err != nil { return ctrl.Result{}, err } @@ -212,7 +212,7 @@ func (r *CachedImageReconciler) Reconcile(ctx context.Context, req ctrl.Request) return ctrl.Result{}, err } - err = updateStatusRaw(r.Client, &cachedImage, func(status *kuikv1alpha1.CachedImageStatus) { + err = updateStatusRaw(r.Client, &cachedImage, func(status *kuikv1alpha1ext1.CachedImageStatus) { cachedImage.Status.IsCached = isCached }) if err != nil { @@ -271,8 +271,8 @@ func (r *CachedImageReconciler) Reconcile(ctx context.Context, req ctrl.Request) return ctrl.Result{}, nil } -func updateStatus(c client.Client, cachedImage *kuikv1alpha1.CachedImage, upstreamDescriptor *remote.Descriptor, update func(*kuikv1alpha1.CachedImageStatus)) error { - return updateStatusRaw(c, cachedImage, func(status *kuikv1alpha1.CachedImageStatus) { +func updateStatus(c client.Client, cachedImage *kuikv1alpha1ext1.CachedImage, upstreamDescriptor *remote.Descriptor, update func(*kuikv1alpha1ext1.CachedImageStatus)) error { + return updateStatusRaw(c, cachedImage, func(status *kuikv1alpha1ext1.CachedImageStatus) { cachedImage.Status.AvailableUpstream = upstreamDescriptor != nil cachedImage.Status.LastSync = metav1.NewTime(time.Now()) @@ -288,13 +288,13 @@ func updateStatus(c client.Client, cachedImage *kuikv1alpha1.CachedImage, upstre }) } -func updateStatusRaw(c client.Client, cachedImage *kuikv1alpha1.CachedImage, update func(*kuikv1alpha1.CachedImageStatus)) error { +func updateStatusRaw(c client.Client, cachedImage *kuikv1alpha1ext1.CachedImage, update func(*kuikv1alpha1ext1.CachedImageStatus)) error { patch := client.MergeFrom(cachedImage.DeepCopy()) update(&cachedImage.Status) return c.Status().Patch(context.Background(), cachedImage, patch) } -func getSanitizedName(cachedImage *kuikv1alpha1.CachedImage) (string, error) { +func getSanitizedName(cachedImage *kuikv1alpha1ext1.CachedImage) (string, error) { ref, err := reference.ParseAnyReference(cachedImage.Spec.SourceImage) if err != nil { return "", err @@ -308,7 +308,7 @@ func getSanitizedName(cachedImage *kuikv1alpha1.CachedImage) (string, error) { return sanitizedName, nil } -func (r *CachedImageReconciler) cacheImage(cachedImage *kuikv1alpha1.CachedImage) error { +func (r *CachedImageReconciler) cacheImage(cachedImage *kuikv1alpha1ext1.CachedImage) error { if err := r.patchPhase(cachedImage, cachedImagePhaseSynchronizing); err != nil { return err } @@ -320,7 +320,7 @@ func (r *CachedImageReconciler) cacheImage(cachedImage *kuikv1alpha1.CachedImage desc, err := registry.GetDescriptor(cachedImage.Spec.SourceImage, pullSecrets, r.InsecureRegistries, r.RootCAs) - statusErr := updateStatus(r.Client, cachedImage, desc, func(status *kuikv1alpha1.CachedImageStatus) { + statusErr := updateStatus(r.Client, cachedImage, desc, func(status *kuikv1alpha1ext1.CachedImageStatus) { _, err := registry.GetLocalDescriptor(cachedImage.Spec.SourceImage) cachedImage.Status.IsCached = err == nil @@ -358,7 +358,7 @@ func (r *CachedImageReconciler) cacheImage(cachedImage *kuikv1alpha1.CachedImage needUpdate = true } if needUpdate { - updateStatus(r.Client, cachedImage, desc, func(status *kuikv1alpha1.CachedImageStatus) { + updateStatus(r.Client, cachedImage, desc, func(status *kuikv1alpha1ext1.CachedImageStatus) { cachedImage.Status.Progress.Total = update.Total cachedImage.Status.Progress.Available = update.Complete }) @@ -369,7 +369,7 @@ func (r *CachedImageReconciler) cacheImage(cachedImage *kuikv1alpha1.CachedImage } err = registry.CacheImage(cachedImage.Spec.SourceImage, desc, r.Architectures, onUpdated) - statusErr = updateStatus(r.Client, cachedImage, desc, func(status *kuikv1alpha1.CachedImageStatus) { + statusErr = updateStatus(r.Client, cachedImage, desc, func(status *kuikv1alpha1ext1.CachedImageStatus) { if err == nil { cachedImage.Status.IsCached = true cachedImage.Status.Digest = desc.Digest.Hex @@ -387,7 +387,7 @@ func (r *CachedImageReconciler) cacheImage(cachedImage *kuikv1alpha1.CachedImage return nil } -func (r *CachedImageReconciler) patchPhase(cachedImage *kuikv1alpha1.CachedImage, phase string) error { +func (r *CachedImageReconciler) patchPhase(cachedImage *kuikv1alpha1ext1.CachedImage, phase string) error { patch := client.MergeFrom(cachedImage.DeepCopy()) cachedImage.Status.Phase = phase return r.Status().Patch(context.Background(), cachedImage, patch) @@ -420,7 +420,7 @@ func (r *CachedImageReconciler) SetupWithManager(mgr ctrl.Manager, maxConcurrent } return ctrl.NewControllerManagedBy(mgr). - For(&kuikv1alpha1.CachedImage{}). + For(&kuikv1alpha1ext1.CachedImage{}). Watches( &corev1.Pod{}, handler.EnqueueRequestsFromMapFunc(r.cachedImagesRequestFromPod), @@ -459,21 +459,21 @@ func (r *CachedImageReconciler) SetupWithManager(mgr ctrl.Manager, maxConcurrent } // updatePodCount update CachedImage UsedBy status -func (r *CachedImageReconciler) updatePodCount(ctx context.Context, cachedImage *kuikv1alpha1.CachedImage) (requeue bool, err error) { +func (r *CachedImageReconciler) updatePodCount(ctx context.Context, cachedImage *kuikv1alpha1ext1.CachedImage) (requeue bool, err error) { var podsList corev1.PodList if err = r.List(ctx, &podsList, client.MatchingFields{core.CachedImageOwnerKey: cachedImage.Name}); err != nil && !apierrors.IsNotFound(err) { return } - pods := []kuikv1alpha1.PodReference{} + pods := []kuikv1alpha1ext1.PodReference{} for _, pod := range podsList.Items { if !pod.DeletionTimestamp.IsZero() { continue } - pods = append(pods, kuikv1alpha1.PodReference{NamespacedName: pod.Namespace + "/" + pod.Name}) + pods = append(pods, kuikv1alpha1ext1.PodReference{NamespacedName: pod.Namespace + "/" + pod.Name}) } - cachedImage.Status.UsedBy = kuikv1alpha1.UsedBy{ + cachedImage.Status.UsedBy = kuikv1alpha1ext1.UsedBy{ Pods: pods, Count: len(pods), } diff --git a/internal/controller/kuik/cachedimage_controller_test.go b/internal/controller/kuik/cachedimage_controller_test.go index e6a91995..3ca7d931 100644 --- a/internal/controller/kuik/cachedimage_controller_test.go +++ b/internal/controller/kuik/cachedimage_controller_test.go @@ -7,7 +7,7 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" + kuikv1alpha1ext1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" v1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -18,20 +18,20 @@ var _ = Describe("CachedImage Controller", func() { Context("When creating CachedImages", func() { It("Should expire image that are not retained only", func() { - fetched := &kuikv1alpha1.CachedImageList{} + fetched := &kuikv1alpha1ext1.CachedImageList{} By("Creating an image without the retain flag", func() { - Expect(k8sClient.Create(context.Background(), &kuikv1alpha1.CachedImage{ + Expect(k8sClient.Create(context.Background(), &kuikv1alpha1ext1.CachedImage{ ObjectMeta: v1.ObjectMeta{ Name: "nginx", }, - Spec: kuikv1alpha1.CachedImageSpec{ + Spec: kuikv1alpha1ext1.CachedImageSpec{ SourceImage: "nginx", }, })).Should(Succeed()) - Eventually(func() []kuikv1alpha1.CachedImage { - expiringCachedImages := []kuikv1alpha1.CachedImage{} + Eventually(func() []kuikv1alpha1ext1.CachedImage { + expiringCachedImages := []kuikv1alpha1ext1.CachedImage{} _ = k8sClient.List(context.Background(), fetched) for _, cachedImage := range fetched.Items { if cachedImage.Spec.ExpiresAt != nil { @@ -43,19 +43,19 @@ var _ = Describe("CachedImage Controller", func() { }) By("Creating an expiring image with the retain flag", func() { - Expect(k8sClient.Create(context.Background(), &kuikv1alpha1.CachedImage{ + Expect(k8sClient.Create(context.Background(), &kuikv1alpha1ext1.CachedImage{ ObjectMeta: v1.ObjectMeta{ Name: "alpine", }, - Spec: kuikv1alpha1.CachedImageSpec{ + Spec: kuikv1alpha1ext1.CachedImageSpec{ SourceImage: "alpine", Retain: true, ExpiresAt: &v1.Time{Time: time.Now().Add(time.Hour)}, }, })).Should(Succeed()) - Eventually(func() []kuikv1alpha1.CachedImage { - expiringCachedImages := []kuikv1alpha1.CachedImage{} + Eventually(func() []kuikv1alpha1ext1.CachedImage { + expiringCachedImages := []kuikv1alpha1ext1.CachedImage{} _ = k8sClient.List(context.Background(), fetched) for _, cachedImage := range fetched.Items { if cachedImage.Spec.ExpiresAt != nil { diff --git a/internal/controller/kuik/repository_controller.go b/internal/controller/kuik/repository_controller.go index a42a3346..315aefc8 100644 --- a/internal/controller/kuik/repository_controller.go +++ b/internal/controller/kuik/repository_controller.go @@ -20,7 +20,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/predicate" - kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" + kuikv1alpha1ext1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" kuikController "github.com/enix/kube-image-keeper/internal/controller" "github.com/enix/kube-image-keeper/internal/registry" ) @@ -53,7 +53,7 @@ type RepositoryReconciler struct { func (r *RepositoryReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { log := log.FromContext(ctx) - var repository kuikv1alpha1.Repository + var repository kuikv1alpha1ext1.Repository if err := r.Get(ctx, req.NamespacedName, &repository); err != nil { return ctrl.Result{}, client.IgnoreNotFound(err) } @@ -67,7 +67,7 @@ func (r *RepositoryReconciler) Reconcile(ctx context.Context, req ctrl.Request) return ctrl.Result{}, err } - var cachedImageList kuikv1alpha1.CachedImageList + var cachedImageList kuikv1alpha1ext1.CachedImageList if err := r.List(ctx, &cachedImageList, client.MatchingFields{repositoryOwnerKey: repository.Name}); err != nil && !apierrors.IsNotFound(err) { return ctrl.Result{}, err } @@ -196,7 +196,7 @@ func (r *RepositoryReconciler) Reconcile(ctx context.Context, req ctrl.Request) return ctrl.Result{}, nil } -func (r *RepositoryReconciler) UpdateStatus(ctx context.Context, repository *kuikv1alpha1.Repository, conditions []metav1.Condition) error { +func (r *RepositoryReconciler) UpdateStatus(ctx context.Context, repository *kuikv1alpha1ext1.Repository, conditions []metav1.Condition) error { log := log.FromContext(ctx) for _, condition := range conditions { @@ -223,12 +223,12 @@ func (r *RepositoryReconciler) UpdateStatus(ctx context.Context, repository *kui // SetupWithManager sets up the controller with the Manager. func (r *RepositoryReconciler) SetupWithManager(mgr ctrl.Manager) error { // Create an index to list CachedImage by Repository - if err := mgr.GetFieldIndexer().IndexField(context.Background(), &kuikv1alpha1.CachedImage{}, repositoryOwnerKey, func(rawObj client.Object) []string { - cachedImage := rawObj.(*kuikv1alpha1.CachedImage) + if err := mgr.GetFieldIndexer().IndexField(context.Background(), &kuikv1alpha1ext1.CachedImage{}, repositoryOwnerKey, func(rawObj client.Object) []string { + cachedImage := rawObj.(*kuikv1alpha1ext1.CachedImage) owners := cachedImage.GetOwnerReferences() for _, owner := range owners { - if owner.APIVersion != kuikv1alpha1.GroupVersion.String() || owner.Kind != "Repository" { + if owner.APIVersion != kuikv1alpha1ext1.GroupVersion.String() || owner.Kind != "Repository" { return nil } @@ -241,9 +241,9 @@ func (r *RepositoryReconciler) SetupWithManager(mgr ctrl.Manager) error { } return ctrl.NewControllerManagedBy(mgr). - For(&kuikv1alpha1.Repository{}). + For(&kuikv1alpha1ext1.Repository{}). Watches( - &kuikv1alpha1.CachedImage{}, + &kuikv1alpha1ext1.CachedImage{}, handler.EnqueueRequestsFromMapFunc(r.repositoryWithDeletingCachedImages), builder.WithPredicates(predicate.Funcs{ DeleteFunc: func(e event.DeleteEvent) bool { @@ -252,7 +252,7 @@ func (r *RepositoryReconciler) SetupWithManager(mgr ctrl.Manager) error { }), ). Watches( - &kuikv1alpha1.CachedImage{}, + &kuikv1alpha1ext1.CachedImage{}, handler.EnqueueRequestsFromMapFunc(requestRepositoryFromCachedImage), builder.WithPredicates(predicate.Funcs{ CreateFunc: func(e event.CreateEvent) bool { @@ -267,8 +267,8 @@ func (r *RepositoryReconciler) SetupWithManager(mgr ctrl.Manager) error { } func (r *RepositoryReconciler) repositoryWithDeletingCachedImages(ctx context.Context, obj client.Object) []ctrl.Request { - cachedImage := obj.(*kuikv1alpha1.CachedImage) - var currentCachedImage kuikv1alpha1.CachedImage + cachedImage := obj.(*kuikv1alpha1ext1.CachedImage) + var currentCachedImage kuikv1alpha1ext1.CachedImage // wait for the CachedImage to be really deleted if err := r.Get(ctx, client.ObjectKeyFromObject(cachedImage), ¤tCachedImage); err == nil || !apierrors.IsNotFound(err) { return nil @@ -278,8 +278,8 @@ func (r *RepositoryReconciler) repositoryWithDeletingCachedImages(ctx context.Co } func requestRepositoryFromCachedImage(ctx context.Context, obj client.Object) []ctrl.Request { - cachedImage := obj.(*kuikv1alpha1.CachedImage) - repositoryName, ok := cachedImage.Labels[kuikv1alpha1.RepositoryLabelName] + cachedImage := obj.(*kuikv1alpha1ext1.CachedImage) + repositoryName, ok := cachedImage.Labels[kuikv1alpha1ext1.RepositoryLabelName] if !ok { return nil } diff --git a/internal/controller/kuik/suite_test.go b/internal/controller/kuik/suite_test.go index ead3070f..48e3b909 100644 --- a/internal/controller/kuik/suite_test.go +++ b/internal/controller/kuik/suite_test.go @@ -39,7 +39,7 @@ import ( logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/log/zap" - kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" + kuikv1alpha1ext1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" "github.com/enix/kube-image-keeper/internal/registry" //+kubebuilder:scaffold:imports ) @@ -134,7 +134,7 @@ var _ = BeforeSuite(func() { Expect(err).NotTo(HaveOccurred()) Expect(cfg).NotTo(BeNil()) - err = kuikv1alpha1.AddToScheme(scheme.Scheme) + err = kuikv1alpha1ext1.AddToScheme(scheme.Scheme) Expect(err).NotTo(HaveOccurred()) //+kubebuilder:scaffold:scheme diff --git a/internal/proxy/server.go b/internal/proxy/server.go index 9271ef9d..1e3d600c 100644 --- a/internal/proxy/server.go +++ b/internal/proxy/server.go @@ -13,7 +13,7 @@ import ( "strings" "github.com/distribution/reference" - kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" + kuikv1alpha1ext1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" "github.com/enix/kube-image-keeper/internal/metrics" "github.com/enix/kube-image-keeper/internal/registry" "github.com/gin-gonic/gin" @@ -251,10 +251,10 @@ func (p *Proxy) proxyRegistry(c *gin.Context, endpoint string, endpointIsOrigin return proxyError } -func (p *Proxy) getRepository(registryDomain string, repositoryName string) (*kuikv1alpha1.Repository, error) { +func (p *Proxy) getRepository(registryDomain string, repositoryName string) (*kuikv1alpha1ext1.Repository, error) { sanitizedName := registry.SanitizeName(registryDomain + "/" + repositoryName) - repository := &kuikv1alpha1.Repository{} + repository := &kuikv1alpha1ext1.Repository{} if err := p.k8sClient.Get(context.Background(), types.NamespacedName{Name: sanitizedName}, repository); err != nil { return nil, err } @@ -262,7 +262,7 @@ func (p *Proxy) getRepository(registryDomain string, repositoryName string) (*ku return repository, nil } -func (p *Proxy) getKeychains(repository *kuikv1alpha1.Repository) ([]authn.Keychain, error) { +func (p *Proxy) getKeychains(repository *kuikv1alpha1ext1.Repository) ([]authn.Keychain, error) { pullSecrets, err := repository.GetPullSecrets(p.k8sClient) if err != nil { return nil, err @@ -271,7 +271,7 @@ func (p *Proxy) getKeychains(repository *kuikv1alpha1.Repository) ([]authn.Keych return registry.GetKeychains(repository.Spec.Name, pullSecrets) } -func (p *Proxy) getAuthentifiedTransport(repository *kuikv1alpha1.Repository, originRegistry string) (http.RoundTripper, error) { +func (p *Proxy) getAuthentifiedTransport(repository *kuikv1alpha1ext1.Repository, originRegistry string) (http.RoundTripper, error) { imageRef, err := name.ParseReference(repository.Spec.Name) if err != nil { return nil, err diff --git a/internal/registry/test_test.go b/internal/registry/test_test.go new file mode 100644 index 00000000..2f3f8d7e --- /dev/null +++ b/internal/registry/test_test.go @@ -0,0 +1,69 @@ +package registry + +/* +import ( + "fmt" + "os" + "testing" + + cranepkg "github.com/google/go-containerregistry/pkg/v1" + "github.com/google/go-containerregistry/pkg/v1/remote" + "github.com/google/go-containerregistry/pkg/v1/tarball" + "github.com/google/go-containerregistry/pkg/v1/types" + v1 "k8s.io/api/core/v1" +) + +// Write remote image to tarball file +func Test_parsing(t *testing.T) { + + sourceImangeName := "mcr.microsoft.com/powershell:lts" + desc, _ := GetDescriptor(sourceImangeName, []v1.Secret{}, []string{}, nil) + destRef, _ := parseLocalReference(sourceImangeName) + // architectures := []string{"amd64"} + switch desc.MediaType { + case types.OCIImageIndex, types.DockerManifestList: + // index, err := desc.ImageIndex() + // if err != nil { + // return + // } + // filteredIndex := mutate.RemoveManifests(index, func(desc cranepkg.Descriptor) bool { + // for _, arch := range architectures { + // if arch == desc.Platform.Architecture { + // return false + // } + // } + // return true + // }) + + // if err := remote.WriteIndex(destRef, filteredIndex); err != nil { + // return + // } + var k = 1 + k = k + 1 + + progressUpdate := make(chan cranepkg.Update, 100) + callback := func(u cranepkg.Update) { + fmt.Print(u.Complete) + } + go func() { + for update := range progressUpdate { + if callback != nil { + callback(update) + } + } + }() + image, err := desc.Image() + if err != nil { + return + } + file, err := os.Create("output.tar") + if err := tarball.Write(destRef, image, file, tarball.WithProgress(progressUpdate)); err != nil { + return + } + + if err := remote.Write(destRef, image, remote.WithProgress(progressUpdate)); err != nil { + return + } + } +} +*/ diff --git a/internal/scheme/scheme.go b/internal/scheme/scheme.go index 7219a98f..3ff4e31d 100644 --- a/internal/scheme/scheme.go +++ b/internal/scheme/scheme.go @@ -6,11 +6,10 @@ import ( // to ensure that exec-entrypoint and run can make use of them. _ "k8s.io/client-go/plugin/pkg/client/auth" + kuikv1alpha1ext1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" "k8s.io/apimachinery/pkg/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime" clientgoscheme "k8s.io/client-go/kubernetes/scheme" - - kuikv1alpha1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" //+kubebuilder:scaffold:imports ) @@ -19,7 +18,7 @@ func NewScheme() *runtime.Scheme { utilruntime.Must(clientgoscheme.AddToScheme(scheme)) - utilruntime.Must(kuikv1alpha1.AddToScheme(scheme)) + utilruntime.Must(kuikv1alpha1ext1.AddToScheme(scheme)) //+kubebuilder:scaffold:scheme return scheme From 4ac479ffdf70f3742871eaadb4b4fc65a7e7cdd4 Mon Sep 17 00:00:00 2001 From: aDisplayName Date: Mon, 26 Aug 2024 15:44:29 -0500 Subject: [PATCH 32/33] remove not used test --- internal/registry/test_test.go | 69 ---------------------------------- 1 file changed, 69 deletions(-) delete mode 100644 internal/registry/test_test.go diff --git a/internal/registry/test_test.go b/internal/registry/test_test.go deleted file mode 100644 index 2f3f8d7e..00000000 --- a/internal/registry/test_test.go +++ /dev/null @@ -1,69 +0,0 @@ -package registry - -/* -import ( - "fmt" - "os" - "testing" - - cranepkg "github.com/google/go-containerregistry/pkg/v1" - "github.com/google/go-containerregistry/pkg/v1/remote" - "github.com/google/go-containerregistry/pkg/v1/tarball" - "github.com/google/go-containerregistry/pkg/v1/types" - v1 "k8s.io/api/core/v1" -) - -// Write remote image to tarball file -func Test_parsing(t *testing.T) { - - sourceImangeName := "mcr.microsoft.com/powershell:lts" - desc, _ := GetDescriptor(sourceImangeName, []v1.Secret{}, []string{}, nil) - destRef, _ := parseLocalReference(sourceImangeName) - // architectures := []string{"amd64"} - switch desc.MediaType { - case types.OCIImageIndex, types.DockerManifestList: - // index, err := desc.ImageIndex() - // if err != nil { - // return - // } - // filteredIndex := mutate.RemoveManifests(index, func(desc cranepkg.Descriptor) bool { - // for _, arch := range architectures { - // if arch == desc.Platform.Architecture { - // return false - // } - // } - // return true - // }) - - // if err := remote.WriteIndex(destRef, filteredIndex); err != nil { - // return - // } - var k = 1 - k = k + 1 - - progressUpdate := make(chan cranepkg.Update, 100) - callback := func(u cranepkg.Update) { - fmt.Print(u.Complete) - } - go func() { - for update := range progressUpdate { - if callback != nil { - callback(update) - } - } - }() - image, err := desc.Image() - if err != nil { - return - } - file, err := os.Create("output.tar") - if err := tarball.Write(destRef, image, file, tarball.WithProgress(progressUpdate)); err != nil { - return - } - - if err := remote.Write(destRef, image, remote.WithProgress(progressUpdate)); err != nil { - return - } - } -} -*/ From dab19c16ee3dd821b5a3ce327d77a1079ec7f2c7 Mon Sep 17 00:00:00 2001 From: aDisplayName Date: Mon, 26 Aug 2024 15:45:24 -0500 Subject: [PATCH 33/33] formatting --- internal/scheme/scheme.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/internal/scheme/scheme.go b/internal/scheme/scheme.go index 3ff4e31d..6f31c795 100644 --- a/internal/scheme/scheme.go +++ b/internal/scheme/scheme.go @@ -6,10 +6,11 @@ import ( // to ensure that exec-entrypoint and run can make use of them. _ "k8s.io/client-go/plugin/pkg/client/auth" - kuikv1alpha1ext1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" "k8s.io/apimachinery/pkg/runtime" utilruntime "k8s.io/apimachinery/pkg/util/runtime" clientgoscheme "k8s.io/client-go/kubernetes/scheme" + + kuikv1alpha1ext1 "github.com/enix/kube-image-keeper/api/kuik/v1alpha1ext1" //+kubebuilder:scaffold:imports )