diff --git a/.github/workflows/tags.yaml b/.github/workflows/tags.yaml index e2418962..80100f23 100644 --- a/.github/workflows/tags.yaml +++ b/.github/workflows/tags.yaml @@ -149,36 +149,35 @@ jobs: version: ${{ steps.tag.outputs.tag }} # A compare-to: ${{ steps.latest_release.outputs.tag }} # B - # Create or reuse DRAFT GitHub Release + # Create or reuse draft release - name: Create / reuse draft release if: steps.check_release.outputs.skip == 'false' id: release uses: actions/github-script@v7 with: script: | - const tag = '${{ steps.tag.outputs.tag }}'; - const isRc = ${{ steps.tag.outputs.is_rc }}; - const outdated = '${{ steps.semver.outputs.comparison-result }}' === '<'; - const makeLatest = outdated ? false : 'legacy'; - const releases = await github.rest.repos.listReleases({ + const tag = '${{ steps.tag.outputs.tag }}'; + const isRc = ${{ steps.tag.outputs.is_rc }}; + const releases = await github.rest.repos.listReleases({ owner: context.repo.owner, repo: context.repo.repo }); - let rel = releases.data.find(r => r.tag_name === tag); + + let rel = releases.data.find(r => r.tag_name === tag); if (!rel) { rel = await github.rest.repos.createRelease({ owner: context.repo.owner, repo: context.repo.repo, - tag_name: tag, - name: tag, - draft: true, - prerelease: isRc, - make_latest: makeLatest + tag_name: tag, + name: tag, + draft: true, + prerelease: isRc // no make_latest for drafts }); console.log(`Draft release created for ${tag}`); } else { console.log(`Re-using existing release ${tag}`); } + core.setOutput('upload_url', rel.upload_url); # Build + upload assets (optional) diff --git a/Makefile b/Makefile index 8cc1b01e..fd5fa28e 100644 --- a/Makefile +++ b/Makefile @@ -22,6 +22,7 @@ build: build-deps make -C packages/system/metallb image make -C packages/system/kamaji image make -C packages/system/bucket image + make -C packages/system/objectstorage-controller image make -C packages/core/testing image make -C packages/core/installer image make manifests diff --git a/hack/e2e-apps/bucket.bats b/hack/e2e-apps/bucket.bats new file mode 100644 index 00000000..2621812a --- /dev/null +++ b/hack/e2e-apps/bucket.bats @@ -0,0 +1,47 @@ +#!/usr/bin/env bats + +@test "Create and Verify Seeweedfs Bucket" { + # Create the bucket resource + name='test' + kubectl apply -f - < bucket-test-credentials.json + + # Get credentials from the secret + ACCESS_KEY=$(jq -r '.spec.secretS3.accessKeyID' bucket-test-credentials.json) + SECRET_KEY=$(jq -r '.spec.secretS3.accessSecretKey' bucket-test-credentials.json) + BUCKET_NAME=$(jq -r '.spec.bucketName' bucket-test-credentials.json) + + # Start port-forwarding + bash -c 'timeout 100s kubectl port-forward service/seaweedfs-s3 -n tenant-root 8333:8333 > /dev/null 2>&1 &' + + # Wait for port-forward to be ready + timeout 30 sh -ec 'until nc -z localhost 8333; do sleep 1; done' + + # Set up MinIO alias with error handling + mc alias set local https://localhost:8333 $ACCESS_KEY $SECRET_KEY --insecure + + # Upload file to bucket + mc cp bucket-test-credentials.json $BUCKET_NAME/bucket-test-credentials.json + + # Verify file was uploaded + mc ls $BUCKET_NAME/bucket-test-credentials.json + + # Clean up uploaded file + mc rm $BUCKET_NAME/bucket-test-credentials.json + + kubectl -n tenant-test delete bucket.apps.cozystack.io ${name} +} diff --git a/hack/e2e-install-cozystack.bats b/hack/e2e-install-cozystack.bats index 80a0b2d0..d55324b3 100644 --- a/hack/e2e-install-cozystack.bats +++ b/hack/e2e-install-cozystack.bats @@ -123,10 +123,10 @@ EOF @test "Configure Tenant and wait for applications" { # Patch root tenant and wait for its releases - kubectl patch tenants/root -n tenant-root --type merge -p '{"spec":{"host":"example.org","ingress":true,"monitoring":true,"etcd":true,"isolated":true}}' + kubectl patch tenants/root -n tenant-root --type merge -p '{"spec":{"host":"example.org","ingress":true,"monitoring":true,"etcd":true,"isolated":true, "seaweedfs": true}}' - timeout 60 sh -ec 'until kubectl get hr -n tenant-root etcd ingress monitoring tenant-root >/dev/null 2>&1; do sleep 1; done' - kubectl wait hr/etcd hr/ingress hr/tenant-root -n tenant-root --timeout=2m --for=condition=ready + timeout 60 sh -ec 'until kubectl get hr -n tenant-root etcd ingress monitoring seaweedfs tenant-root >/dev/null 2>&1; do sleep 1; done' + kubectl wait hr/etcd hr/ingress hr/tenant-root hr/seaweedfs -n tenant-root --timeout=4m --for=condition=ready if ! kubectl wait hr/monitoring -n tenant-root --timeout=2m --for=condition=ready; then flux reconcile hr monitoring -n tenant-root --force diff --git a/packages/apps/http-cache/images/nginx-cache.tag b/packages/apps/http-cache/images/nginx-cache.tag index ac7fd7f0..987b0886 100644 --- a/packages/apps/http-cache/images/nginx-cache.tag +++ b/packages/apps/http-cache/images/nginx-cache.tag @@ -1 +1 @@ -ghcr.io/cozystack/cozystack/nginx-cache:0.6.1@sha256:e0a07082bb6fc6aeaae2315f335386f1705a646c72f9e0af512aebbca5cb2b15 +ghcr.io/cozystack/cozystack/nginx-cache:0.6.1@sha256:50ac1581e3100bd6c477a71161cb455a341ffaf9e5e2f6086802e4e25271e8af diff --git a/packages/apps/kubernetes/Chart.yaml b/packages/apps/kubernetes/Chart.yaml index 2c49af9b..79133ac1 100644 --- a/packages/apps/kubernetes/Chart.yaml +++ b/packages/apps/kubernetes/Chart.yaml @@ -16,7 +16,7 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.26.0 +version: 0.26.3 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to diff --git a/packages/apps/kubernetes/images/cluster-autoscaler.tag b/packages/apps/kubernetes/images/cluster-autoscaler.tag index f187c45e..71276b45 100644 --- a/packages/apps/kubernetes/images/cluster-autoscaler.tag +++ b/packages/apps/kubernetes/images/cluster-autoscaler.tag @@ -1 +1 @@ -ghcr.io/cozystack/cozystack/cluster-autoscaler:0.26.0@sha256:3a8170433e1632e5cc2b6d9db34d0605e8e6c63c158282c38450415e700e932e +ghcr.io/cozystack/cozystack/cluster-autoscaler:0.26.3@sha256:e4fbb7d2043f25b90cc8840468d0880e9d3d72ae8b1c8801bf8c35f944cc485d diff --git a/packages/apps/kubernetes/images/kubevirt-cloud-provider.tag b/packages/apps/kubernetes/images/kubevirt-cloud-provider.tag index c3535424..0a2d98d9 100644 --- a/packages/apps/kubernetes/images/kubevirt-cloud-provider.tag +++ b/packages/apps/kubernetes/images/kubevirt-cloud-provider.tag @@ -1 +1 @@ -ghcr.io/cozystack/cozystack/kubevirt-cloud-provider:0.26.0@sha256:49843a0b670eab061627e48df338b2b8bc9f577dc2cfd4c2ed4071e02e64b424 +ghcr.io/cozystack/cozystack/kubevirt-cloud-provider:0.26.3@sha256:5335c044313b69ee13b30ca4941687e509005e55f4ae25723861edbf2fbd6dd2 diff --git a/packages/apps/kubernetes/images/kubevirt-cloud-provider/Dockerfile b/packages/apps/kubernetes/images/kubevirt-cloud-provider/Dockerfile index 563251d8..58a4d039 100644 --- a/packages/apps/kubernetes/images/kubevirt-cloud-provider/Dockerfile +++ b/packages/apps/kubernetes/images/kubevirt-cloud-provider/Dockerfile @@ -21,6 +21,6 @@ RUN go mod vendor RUN CGO_ENABLED=0 go build -mod=vendor -ldflags="-s -w" -o bin/kubevirt-cloud-controller-manager ./cmd/kubevirt-cloud-controller-manager -FROM registry.access.redhat.com/ubi9/ubi-micro +FROM scratch COPY --from=builder /go/src/kubevirt.io/cloud-provider-kubevirt/bin/kubevirt-cloud-controller-manager /bin/kubevirt-cloud-controller-manager ENTRYPOINT [ "/bin/kubevirt-cloud-controller-manager" ] diff --git a/packages/apps/kubernetes/images/kubevirt-csi-driver.tag b/packages/apps/kubernetes/images/kubevirt-csi-driver.tag index 9ccb507d..fea2f898 100644 --- a/packages/apps/kubernetes/images/kubevirt-csi-driver.tag +++ b/packages/apps/kubernetes/images/kubevirt-csi-driver.tag @@ -1 +1 @@ -ghcr.io/cozystack/cozystack/kubevirt-csi-driver:0.26.0@sha256:445c2727b04ac68595b43c988ff17b3d69a7b22b0644fde3b10c65b47a7bc036 +ghcr.io/cozystack/cozystack/kubevirt-csi-driver:0.26.3@sha256:df3a2f503b4a035567b20b81a0f105c15971274fd675101c3b3eb2413d966d2e diff --git a/packages/apps/kubernetes/templates/helmreleases/csi.yaml b/packages/apps/kubernetes/templates/helmreleases/csi.yaml index 8bbb1b9d..09927e8a 100644 --- a/packages/apps/kubernetes/templates/helmreleases/csi.yaml +++ b/packages/apps/kubernetes/templates/helmreleases/csi.yaml @@ -35,6 +35,8 @@ spec: storageClass: "{{ . }}" {{- end }} dependsOn: + - name: {{ .Release.Name }}-vsnap-crd + namespace: {{ .Release.Namespace }} {{- if lookup "helm.toolkit.fluxcd.io/v2" "HelmRelease" .Release.Namespace .Release.Name }} - name: {{ .Release.Name }} namespace: {{ .Release.Namespace }} diff --git a/packages/apps/kubernetes/templates/helmreleases/vertical-pod-autoscaler.yaml b/packages/apps/kubernetes/templates/helmreleases/vertical-pod-autoscaler.yaml index 0d86b24e..34375d8c 100644 --- a/packages/apps/kubernetes/templates/helmreleases/vertical-pod-autoscaler.yaml +++ b/packages/apps/kubernetes/templates/helmreleases/vertical-pod-autoscaler.yaml @@ -3,6 +3,7 @@ {{- $clusterDomain := (index $cozyConfig.data "cluster-domain") | default "cozy.local" }} {{- $myNS := lookup "v1" "Namespace" "" .Release.Namespace }} {{- $targetTenant := index $myNS.metadata.annotations "namespace.cozystack.io/monitoring" }} +vpaForVPA: false vertical-pod-autoscaler: recommender: extraArgs: diff --git a/packages/apps/kubernetes/templates/helmreleases/volumesnapshot_crd.yaml b/packages/apps/kubernetes/templates/helmreleases/volumesnapshot_crd.yaml index a21a913c..d12b669f 100644 --- a/packages/apps/kubernetes/templates/helmreleases/volumesnapshot_crd.yaml +++ b/packages/apps/kubernetes/templates/helmreleases/volumesnapshot_crd.yaml @@ -1,16 +1,16 @@ apiVersion: helm.toolkit.fluxcd.io/v2 kind: HelmRelease metadata: - name: {{ .Release.Name }}-volumesnapshot-crd-for-tenant-k8s + name: {{ .Release.Name }}-vsnap-crd labels: cozystack.io/repository: system cozystack.io/target-cluster-name: {{ .Release.Name }} spec: interval: 5m - releaseName: volumesnapshot-crd-for-tenant-k8s + releaseName: vsnap-crd chart: spec: - chart: cozy-volumesnapshot-crd-for-tenant-k8s + chart: cozy-vsnap-crd reconcileStrategy: Revision sourceRef: kind: HelmRepository @@ -21,8 +21,8 @@ spec: secretRef: name: {{ .Release.Name }}-admin-kubeconfig key: super-admin.svc - targetNamespace: cozy-volumesnapshot-crd-for-tenant-k8s - storageNamespace: cozy-volumesnapshot-crd-for-tenant-k8s + targetNamespace: cozy-vsnap-crd + storageNamespace: cozy-vsnap-crd install: createNamespace: true remediation: diff --git a/packages/apps/tenant/Chart.yaml b/packages/apps/tenant/Chart.yaml index 0839086b..0bcb4d79 100644 --- a/packages/apps/tenant/Chart.yaml +++ b/packages/apps/tenant/Chart.yaml @@ -4,4 +4,4 @@ description: Separated tenant namespace icon: /logos/tenant.svg type: application -version: 1.11.1 +version: 1.11.2 diff --git a/packages/apps/tenant/templates/networkpolicy.yaml b/packages/apps/tenant/templates/networkpolicy.yaml index 6d80f996..b66e85ff 100644 --- a/packages/apps/tenant/templates/networkpolicy.yaml +++ b/packages/apps/tenant/templates/networkpolicy.yaml @@ -48,6 +48,20 @@ spec: {{- range $i, $v := $parts }} {{- if ne $i 0 }} - matchLabels: + "k8s:app.kubernetes.io/name": "vminsert" + "k8s:io.kubernetes.pod.namespace": {{ join "-" (slice $parts 0 (add $i 1)) }} + {{- end }} + {{- end }} + {{- end }} + {{- end }} + {{- if ne (include "tenant.name" .) "tenant-root" }} + - toEndpoints: + {{- if hasPrefix "tenant-" .Release.Namespace }} + {{- $parts := splitList "-" .Release.Namespace }} + {{- range $i, $v := $parts }} + {{- if ne $i 0 }} + - matchLabels: + "k8s:app.kubernetes.io/instance": "etcd" "k8s:io.kubernetes.pod.namespace": {{ join "-" (slice $parts 0 (add $i 1)) }} {{- end }} {{- end }} diff --git a/packages/apps/versions_map b/packages/apps/versions_map index d8272612..c98d9e9b 100644 --- a/packages/apps/versions_map +++ b/packages/apps/versions_map @@ -61,7 +61,10 @@ kubernetes 0.24.0 62cb694d kubernetes 0.25.0 70f82667 kubernetes 0.25.1 acd4663a kubernetes 0.25.2 08cb7c0f -kubernetes 0.26.0 HEAD +kubernetes 0.26.0 9584e5f5 +kubernetes 0.26.1 0e47e1e8 +kubernetes 0.26.2 8ddbe32e +kubernetes 0.26.3 HEAD mysql 0.1.0 263e47be mysql 0.2.0 c24a103f mysql 0.3.0 53f2365e @@ -151,7 +154,8 @@ tcp-balancer 0.5.0 08cb7c0f tcp-balancer 0.5.1 HEAD tenant 1.10.0 4369b031 tenant 1.11.0 08cb7c0f -tenant 1.11.1 HEAD +tenant 1.11.1 28c9fcd6 +tenant 1.11.2 HEAD virtual-machine 0.1.4 f2015d65 virtual-machine 0.1.5 263e47be virtual-machine 0.2.0 c0685f43 @@ -171,7 +175,8 @@ virtual-machine 0.10.2 632224a3 virtual-machine 0.11.0 4369b031 virtual-machine 0.12.0 acd4663a virtual-machine 0.12.1 909208ba -virtual-machine 0.12.2 HEAD +virtual-machine 0.12.2 8ddbe32e +virtual-machine 0.12.3 HEAD vm-disk 0.1.0 d971f2ff vm-disk 0.1.1 6130f43d vm-disk 0.1.2 632224a3 @@ -190,7 +195,8 @@ vm-instance 0.7.2 632224a3 vm-instance 0.8.0 4369b031 vm-instance 0.9.0 acd4663a vm-instance 0.10.0 909208ba -vm-instance 0.10.1 HEAD +vm-instance 0.10.1 8ddbe32e +vm-instance 0.10.2 HEAD vpn 0.1.0 263e47be vpn 0.2.0 53f2365e vpn 0.3.0 6c5cf5bf diff --git a/packages/apps/virtual-machine/Chart.yaml b/packages/apps/virtual-machine/Chart.yaml index 68b5e986..e58f6a0c 100644 --- a/packages/apps/virtual-machine/Chart.yaml +++ b/packages/apps/virtual-machine/Chart.yaml @@ -17,7 +17,7 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.12.2 +version: 0.12.3 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to diff --git a/packages/apps/virtual-machine/Makefile b/packages/apps/virtual-machine/Makefile index 5aaa17e1..5234bd85 100644 --- a/packages/apps/virtual-machine/Makefile +++ b/packages/apps/virtual-machine/Makefile @@ -3,10 +3,10 @@ include ../../../scripts/package.mk generate: readme-generator-for-helm -v values.yaml -s values.schema.json -r README.md yq -o json -i '.properties.gpus.items.type = "object" | .properties.gpus.default = []' values.schema.json - INSTANCE_TYPES=$$(yq e '.metadata.name' -o=json -r ../../system/kubevirt-instancetypes/templates/instancetypes.yaml | yq 'split(" ") | . + [""]' -o json) \ - && yq -i -o json ".properties.instanceType.optional=true | .properties.instanceType.enum = $${INSTANCE_TYPES}" values.schema.json + # INSTANCE_TYPES=$$(yq e '.metadata.name' -o=json -r ../../system/kubevirt-instancetypes/templates/instancetypes.yaml | yq 'split(" ") | . + [""]' -o json) \ + # && yq -i -o json ".properties.instanceType.enum = $${INSTANCE_TYPES}" values.schema.json PREFERENCES=$$(yq e '.metadata.name' -o=json -r ../../system/kubevirt-instancetypes/templates/preferences.yaml | yq 'split(" ") | . + [""]' -o json) \ - && yq -i -o json ".properties.instanceProfile.optional=true | .properties.instanceProfile.enum = $${PREFERENCES}" values.schema.json + && yq -i -o json ".properties.instanceProfile.enum = $${PREFERENCES}" values.schema.json yq -i -o json '.properties.externalPorts.items.type = "integer"' values.schema.json yq -i -o json '.properties.systemDisk.properties.image.enum = ["ubuntu", "cirros", "alpine", "fedora", "talos"]' values.schema.json yq -i -o json '.properties.externalMethod.enum = ["PortList", "WholeIP"]' values.schema.json diff --git a/packages/apps/virtual-machine/values.schema.json b/packages/apps/virtual-machine/values.schema.json index 48650049..2d328886 100644 --- a/packages/apps/virtual-machine/values.schema.json +++ b/packages/apps/virtual-machine/values.schema.json @@ -44,7 +44,6 @@ "default": "ubuntu", "description": "Virtual Machine preferences profile", "type": "string", - "optional": true, "enum": [ "alpine", "centos.7", @@ -94,59 +93,7 @@ "instanceType": { "default": "u1.medium", "description": "Virtual Machine instance type", - "type": "string", - "optional": true, - "enum": [ - "cx1.2xlarge", - "cx1.4xlarge", - "cx1.8xlarge", - "cx1.large", - "cx1.medium", - "cx1.xlarge", - "gn1.2xlarge", - "gn1.4xlarge", - "gn1.8xlarge", - "gn1.xlarge", - "m1.2xlarge", - "m1.4xlarge", - "m1.8xlarge", - "m1.large", - "m1.xlarge", - "n1.2xlarge", - "n1.4xlarge", - "n1.8xlarge", - "n1.large", - "n1.medium", - "n1.xlarge", - "o1.2xlarge", - "o1.4xlarge", - "o1.8xlarge", - "o1.large", - "o1.medium", - "o1.micro", - "o1.nano", - "o1.small", - "o1.xlarge", - "rt1.2xlarge", - "rt1.4xlarge", - "rt1.8xlarge", - "rt1.large", - "rt1.medium", - "rt1.micro", - "rt1.small", - "rt1.xlarge", - "u1.2xlarge", - "u1.2xmedium", - "u1.4xlarge", - "u1.8xlarge", - "u1.large", - "u1.medium", - "u1.micro", - "u1.nano", - "u1.small", - "u1.xlarge", - "" - ] + "type": "string" }, "resources": { "properties": { diff --git a/packages/apps/vm-instance/Chart.yaml b/packages/apps/vm-instance/Chart.yaml index 28733b49..3adb6a85 100644 --- a/packages/apps/vm-instance/Chart.yaml +++ b/packages/apps/vm-instance/Chart.yaml @@ -17,7 +17,7 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.10.1 +version: 0.10.2 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to diff --git a/packages/apps/vm-instance/Makefile b/packages/apps/vm-instance/Makefile index f400058e..38d781ae 100644 --- a/packages/apps/vm-instance/Makefile +++ b/packages/apps/vm-instance/Makefile @@ -4,9 +4,9 @@ generate: readme-generator-for-helm -v values.yaml -s values.schema.json -r README.md yq -o json -i '.properties.disks.items.type = "object" | .properties.disks.default = []' values.schema.json yq -o json -i '.properties.gpus.items.type = "object" | .properties.gpus.default = []' values.schema.json - INSTANCE_TYPES=$$(yq e '.metadata.name' -o=json -r ../../system/kubevirt-instancetypes/templates/instancetypes.yaml | yq 'split(" ") | . + [""]' -o json) \ - && yq -i -o json ".properties.instanceType.optional=true | .properties.instanceType.enum = $${INSTANCE_TYPES}" values.schema.json + #INSTANCE_TYPES=$$(yq e '.metadata.name' -o=json -r ../../system/kubevirt-instancetypes/templates/instancetypes.yaml | yq 'split(" ") | . + [""]' -o json) \ + # && yq -i -o json ".properties.instanceType.enum = $${INSTANCE_TYPES}" values.schema.json PREFERENCES=$$(yq e '.metadata.name' -o=json -r ../../system/kubevirt-instancetypes/templates/preferences.yaml | yq 'split(" ") | . + [""]' -o json) \ - && yq -i -o json ".properties.instanceProfile.optional=true | .properties.instanceProfile.enum = $${PREFERENCES}" values.schema.json + && yq -i -o json ".properties.instanceProfile.enum = $${PREFERENCES}" values.schema.json yq -i -o json '.properties.externalPorts.items.type = "integer"' values.schema.json yq -i -o json '.properties.externalMethod.enum = ["PortList", "WholeIP"]' values.schema.json diff --git a/packages/apps/vm-instance/values.schema.json b/packages/apps/vm-instance/values.schema.json index acde789f..c411e3ab 100644 --- a/packages/apps/vm-instance/values.schema.json +++ b/packages/apps/vm-instance/values.schema.json @@ -52,7 +52,6 @@ "default": "ubuntu", "description": "Virtual Machine preferences profile", "type": "string", - "optional": true, "enum": [ "alpine", "centos.7", @@ -102,59 +101,7 @@ "instanceType": { "default": "u1.medium", "description": "Virtual Machine instance type", - "type": "string", - "optional": true, - "enum": [ - "cx1.2xlarge", - "cx1.4xlarge", - "cx1.8xlarge", - "cx1.large", - "cx1.medium", - "cx1.xlarge", - "gn1.2xlarge", - "gn1.4xlarge", - "gn1.8xlarge", - "gn1.xlarge", - "m1.2xlarge", - "m1.4xlarge", - "m1.8xlarge", - "m1.large", - "m1.xlarge", - "n1.2xlarge", - "n1.4xlarge", - "n1.8xlarge", - "n1.large", - "n1.medium", - "n1.xlarge", - "o1.2xlarge", - "o1.4xlarge", - "o1.8xlarge", - "o1.large", - "o1.medium", - "o1.micro", - "o1.nano", - "o1.small", - "o1.xlarge", - "rt1.2xlarge", - "rt1.4xlarge", - "rt1.8xlarge", - "rt1.large", - "rt1.medium", - "rt1.micro", - "rt1.small", - "rt1.xlarge", - "u1.2xlarge", - "u1.2xmedium", - "u1.4xlarge", - "u1.8xlarge", - "u1.large", - "u1.medium", - "u1.micro", - "u1.nano", - "u1.small", - "u1.xlarge", - "" - ] + "type": "string" }, "resources": { "properties": { diff --git a/packages/core/installer/values.yaml b/packages/core/installer/values.yaml index 16b250eb..be3b0fa1 100644 --- a/packages/core/installer/values.yaml +++ b/packages/core/installer/values.yaml @@ -1,2 +1,2 @@ cozystack: - image: ghcr.io/cozystack/cozystack/installer:v0.34.0@sha256:3716c495c7d5c1f321e59cdc445e0853e8219932ee40e07ffcec99da7fcc7c6c + image: ghcr.io/cozystack/cozystack/installer:v0.34.8@sha256:c9dae64d1cbb3882749aae3af47e63152a835cb603af12ba573618c0d0940437 diff --git a/packages/core/testing/images/e2e-sandbox/Dockerfile b/packages/core/testing/images/e2e-sandbox/Dockerfile index d67dec13..069a1905 100755 --- a/packages/core/testing/images/e2e-sandbox/Dockerfile +++ b/packages/core/testing/images/e2e-sandbox/Dockerfile @@ -19,6 +19,7 @@ RUN curl -sSL "https://github.com/mikefarah/yq/releases/download/v4.44.3/yq_${TA && chmod +x /usr/local/bin/yq RUN curl -sSL "https://fluxcd.io/install.sh" | bash RUN curl -sSL "https://github.com/cozystack/cozypkg/raw/refs/heads/main/hack/install.sh" | sh -s -- -v "${COZYPKG_VERSION}" - +RUN curl https://dl.min.io/client/mc/release/${TARGETOS}-${TARGETARCH}/mc --create-dirs -o /usr/local/bin/mc \ +&& chmod +x /usr/local/bin/mc COPY entrypoint.sh /usr/local/bin/entrypoint.sh ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] diff --git a/packages/core/testing/values.yaml b/packages/core/testing/values.yaml index a45e82a3..99db3b67 100755 --- a/packages/core/testing/values.yaml +++ b/packages/core/testing/values.yaml @@ -1,2 +1,2 @@ e2e: - image: ghcr.io/cozystack/cozystack/e2e-sandbox:v0.34.0@sha256:2c7dab87c149b63f74f18a591f38b1253ab581055351aec81816519245bc04aa + image: ghcr.io/cozystack/cozystack/e2e-sandbox:v0.34.8@sha256:f88293295f95419e0ec5484430ae3b46c58dc07050ccb12104b7b0e7902b1712 diff --git a/packages/extra/bootbox/images/matchbox.tag b/packages/extra/bootbox/images/matchbox.tag index 8438d210..192dcbf3 100644 --- a/packages/extra/bootbox/images/matchbox.tag +++ b/packages/extra/bootbox/images/matchbox.tag @@ -1 +1 @@ -ghcr.io/cozystack/cozystack/matchbox:v0.34.0@sha256:22a11dd07e3eaed843c1ab4f589b629740159a65aeeec9afc495ddd818868dfc +ghcr.io/cozystack/cozystack/matchbox:v0.34.8@sha256:9280492dad668db1aeb678e1d5d5cf29a86ada26776fbcbe36bbfa1fc1e9d311 diff --git a/packages/extra/etcd/Chart.yaml b/packages/extra/etcd/Chart.yaml index cdc44062..acf80e4c 100644 --- a/packages/extra/etcd/Chart.yaml +++ b/packages/extra/etcd/Chart.yaml @@ -3,4 +3,4 @@ name: etcd description: Storage for Kubernetes clusters icon: /logos/etcd.svg type: application -version: 2.9.0 +version: 2.9.1 diff --git a/packages/extra/etcd/templates/etcd-cluster.yaml b/packages/extra/etcd/templates/etcd-cluster.yaml index f3b5637f..19cef37a 100644 --- a/packages/extra/etcd/templates/etcd-cluster.yaml +++ b/packages/extra/etcd/templates/etcd-cluster.yaml @@ -49,6 +49,14 @@ spec: {{- with .Values.resources }} resources: {{- include "cozy-lib.resources.sanitize" (list . $) | nindent 10 }} {{- end }} + {{- $configMap := lookup "v1" "ConfigMap" "cozy-system" "cozystack-scheduling" }} + {{- $rawConstraints := "" }} + {{- if $configMap }} + {{- $rawConstraints = get $configMap.data "globalAppTopologySpreadConstraints" }} + {{- end }} + {{- if $rawConstraints }} + {{- $rawConstraints | fromYaml | toYaml | nindent 6 }} + {{- else }} topologySpreadConstraints: - maxSkew: 1 topologyKey: "kubernetes.io/hostname" @@ -56,6 +64,7 @@ spec: labelSelector: matchLabels: app.kubernetes.io/instance: etcd + {{- end }} podDisruptionBudgetTemplate: {} --- apiVersion: cert-manager.io/v1 diff --git a/packages/extra/seaweedfs/Chart.yaml b/packages/extra/seaweedfs/Chart.yaml index 233b0c8b..24796add 100644 --- a/packages/extra/seaweedfs/Chart.yaml +++ b/packages/extra/seaweedfs/Chart.yaml @@ -16,7 +16,7 @@ type: application # This is the chart version. This version number should be incremented each time you make changes # to the chart and its templates, including the app version. # Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 0.5.0 +version: 0.6.0 # This is the version number of the application being deployed. This version number should be # incremented each time you make changes to the application. Versions are not expected to diff --git a/packages/extra/seaweedfs/Makefile b/packages/extra/seaweedfs/Makefile index a2504ed5..78e21e04 100644 --- a/packages/extra/seaweedfs/Makefile +++ b/packages/extra/seaweedfs/Makefile @@ -4,4 +4,4 @@ include ../../../scripts/package.mk generate: readme-generator-for-helm -v values.yaml -s values.schema.json -r README.md - yq -o json -i '.properties.topology.enum = ["Simple","MultiZone"]' values.schema.json + yq -o json -i '.properties.topology.enum = ["Simple","MultiZone","Client"]' values.schema.json diff --git a/packages/extra/seaweedfs/README.md b/packages/extra/seaweedfs/README.md index f52bc9d3..aea13939 100644 --- a/packages/extra/seaweedfs/README.md +++ b/packages/extra/seaweedfs/README.md @@ -7,9 +7,12 @@ | Name | Description | Value | | ------------------- | ------------------------------------------------------------------------------------------------------ | -------- | | `host` | The hostname used to access the SeaweedFS externally (defaults to 's3' subdomain for the tenant host). | `""` | -| `topology` | The topology of the SeaweedFS cluster. (allowed values: Simple, MultiZone) | `Simple` | +| `topology` | The topology of the SeaweedFS cluster. (allowed values: Simple, MultiZone, Client) | `Simple` | | `replicationFactor` | The number of replicas for each volume in the SeaweedFS cluster. | `2` | | `replicas` | Persistent Volume size for SeaweedFS | `2` | | `size` | Persistent Volume size | `10Gi` | | `storageClass` | StorageClass used to store the data | `""` | | `zones` | A map of zones for MultiZone topology. Each zone can have its own number of replicas and size. | `{}` | +| `filer.grpcHost` | The hostname used to expose or access the filer service externally. | `""` | +| `filer.grpcPort` | The port used to access the filer service externally. | `443` | +| `filer.whitelist` | A list of IP addresses or CIDR ranges that are allowed to access the filer service. | `[]` | diff --git a/packages/extra/seaweedfs/images/objectstorage-sidecar.tag b/packages/extra/seaweedfs/images/objectstorage-sidecar.tag new file mode 100644 index 00000000..28f01a1a --- /dev/null +++ b/packages/extra/seaweedfs/images/objectstorage-sidecar.tag @@ -0,0 +1 @@ +ghcr.io/cozystack/cozystack/objectstorage-sidecar:v0.35.0-alpha.1@sha256:e4f9a7302285ea9febeb28fc2fa97cb7c01bb91e602f975c31aad1fe46f778f7 diff --git a/packages/extra/seaweedfs/images/seaweedfs-cosi-driver.tag b/packages/extra/seaweedfs/images/seaweedfs-cosi-driver.tag new file mode 100644 index 00000000..f07c125d --- /dev/null +++ b/packages/extra/seaweedfs/images/seaweedfs-cosi-driver.tag @@ -0,0 +1 @@ +ghcr.io/seaweedfs/seaweedfs-cosi-driver:v0.2.0 diff --git a/packages/extra/seaweedfs/templates/client/cosi-bucket-class.yaml b/packages/extra/seaweedfs/templates/client/cosi-bucket-class.yaml new file mode 100644 index 00000000..76eda0dc --- /dev/null +++ b/packages/extra/seaweedfs/templates/client/cosi-bucket-class.yaml @@ -0,0 +1,16 @@ +{{- if eq .Values.topology "Client" }} +--- +kind: BucketClass +apiVersion: objectstorage.k8s.io/v1alpha1 +metadata: + name: {{ .Release.Namespace }} +driverName: {{ .Release.Namespace }}.seaweedfs.objectstorage.k8s.io +deletionPolicy: Delete +--- +kind: BucketAccessClass +apiVersion: objectstorage.k8s.io/v1alpha1 +metadata: + name: {{ .Release.Namespace }} +driverName: {{ .Release.Namespace }}.seaweedfs.objectstorage.k8s.io +authenticationType: KEY +{{- end }} diff --git a/packages/extra/seaweedfs/templates/client/cosi-cluster-role.yaml b/packages/extra/seaweedfs/templates/client/cosi-cluster-role.yaml new file mode 100644 index 00000000..4ee30f30 --- /dev/null +++ b/packages/extra/seaweedfs/templates/client/cosi-cluster-role.yaml @@ -0,0 +1,61 @@ +{{- if eq .Values.topology "Client" }} +--- +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: {{ .Release.Namespace }}-objectstorage-provisioner +rules: +- apiGroups: ["objectstorage.k8s.io"] + resources: + - "buckets" + - "bucketaccesses" + - "bucketclaims" + - "bucketclasses" + - "bucketclasses/status" + - "bucketaccessclasses" + - "buckets/status" + - "bucketaccesses/status" + - "bucketclaims/status" + - "bucketaccessclasses/status" + verbs: + - "get" + - "list" + - "watch" + - "update" + - "create" + - "delete" +- apiGroups: ["coordination.k8s.io"] + resources: ["leases"] + verbs: + - "get" + - "watch" + - "list" + - "delete" + - "update" + - "create" +- apiGroups: [""] + resources: + - "secrets" + - "events" + verbs: + - "get" + - "list" + - "watch" + - "update" + - "create" + - "delete" + - "patch" +--- +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: {{ .Release.Namespace }}-objectstorage-provisioner +subjects: + - kind: ServiceAccount + name: {{ .Release.Name }}-objectstorage-provisioner + namespace: {{ .Release.Namespace }} +roleRef: + kind: ClusterRole + name: {{ .Release.Namespace }}-objectstorage-provisioner + apiGroup: rbac.authorization.k8s.io +{{- end }} diff --git a/packages/extra/seaweedfs/templates/client/cosi-deployment.yaml b/packages/extra/seaweedfs/templates/client/cosi-deployment.yaml new file mode 100644 index 00000000..5307a67f --- /dev/null +++ b/packages/extra/seaweedfs/templates/client/cosi-deployment.yaml @@ -0,0 +1,88 @@ +{{- if eq .Values.topology "Client" }} +{{- $myNS := lookup "v1" "Namespace" "" .Release.Namespace }} +{{- $ingress := index $myNS.metadata.annotations "namespace.cozystack.io/ingress" }} +{{- $host := index $myNS.metadata.annotations "namespace.cozystack.io/host" }} +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ $.Release.Name }}-objectstorage-provisioner + namespace: {{ $.Release.Namespace }} + labels: + app.kubernetes.io/component: objectstorage-provisioner + app.kubernetes.io/instance: seaweedfs + app.kubernetes.io/name: {{ $.Release.Name }} +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/component: objectstorage-provisioner + app.kubernetes.io/instance: seaweedfs + app.kubernetes.io/name: {{ $.Release.Name }} + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 25% + type: RollingUpdate + template: + metadata: + creationTimestamp: null + labels: + policy.cozystack.io/allow-to-apiserver: "true" + app.kubernetes.io/component: objectstorage-provisioner + app.kubernetes.io/instance: seaweedfs + app.kubernetes.io/name: {{ $.Release.Name }} + spec: + containers: + - name: seaweedfs-cosi-driver + image: "{{ $.Files.Get "images/seaweedfs-cosi-driver.tag" | trim }}" + imagePullPolicy: IfNotPresent + env: + - name: DRIVERNAME + value: {{ .Release.Namespace }}.seaweedfs.objectstorage.k8s.io + - name: ENDPOINT + value: https://{{ .Values.host | default (printf "s3.%s" $host) }} + - name: SEAWEEDFS_FILER + value: "{{ .Values.filer.grpcHost }}:{{ .Values.filer.grpcPort }}" + - name: WEED_GRPC_CLIENT_KEY + value: /usr/local/share/ca-certificates/client/tls.key + - name: WEED_GRPC_CLIENT_CERT + value: /usr/local/share/ca-certificates/client/tls.crt + - name: WEED_GRPC_CA + value: /usr/local/share/ca-certificates/client/ca.crt + resources: + limits: + cpu: 500m + memory: 512Mi + requests: + cpu: 100m + memory: 128Mi + volumeMounts: + - mountPath: /var/lib/cosi + name: socket + - mountPath: /usr/local/share/ca-certificates/client/ + name: client-cert + readOnly: true + - name: seaweedfs-cosi-sidecar + image: "{{ $.Files.Get "images/objectstorage-sidecar.tag" | trim }}" + imagePullPolicy: IfNotPresent + args: + - --v=5 + env: + - name: POD_NAMESPACE + value: {{ .Release.Namespace }} + volumeMounts: + - mountPath: /var/lib/cosi + name: socket + enableServiceLinks: false + restartPolicy: Always + terminationGracePeriodSeconds: 10 + serviceAccountName: {{ .Release.Name }}-objectstorage-provisioner + volumes: + - name: socket + emptyDir: {} + - name: client-cert + secret: + defaultMode: 420 + secretName: seaweedfs-client-cert +{{- end }} diff --git a/packages/extra/seaweedfs/templates/client/cosi-service-account.yaml b/packages/extra/seaweedfs/templates/client/cosi-service-account.yaml new file mode 100644 index 00000000..20407dee --- /dev/null +++ b/packages/extra/seaweedfs/templates/client/cosi-service-account.yaml @@ -0,0 +1,8 @@ +{{- if eq .Values.topology "Client" }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ .Release.Name }}-objectstorage-provisioner + namespace: {{ .Release.Namespace }} +automountServiceAccountToken: true +{{- end }} diff --git a/packages/extra/seaweedfs/templates/cm.yaml b/packages/extra/seaweedfs/templates/cm.yaml new file mode 100644 index 00000000..1aec9a1b --- /dev/null +++ b/packages/extra/seaweedfs/templates/cm.yaml @@ -0,0 +1,6 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: "{{ .Release.Name }}-deployed-topology" +data: + topology: {{ quote .Values.topology }} diff --git a/packages/extra/seaweedfs/templates/dashboard-resourcemap.yaml b/packages/extra/seaweedfs/templates/dashboard-resourcemap.yaml index 02c9b2aa..ec8860b7 100644 --- a/packages/extra/seaweedfs/templates/dashboard-resourcemap.yaml +++ b/packages/extra/seaweedfs/templates/dashboard-resourcemap.yaml @@ -3,6 +3,7 @@ kind: Role metadata: name: {{ .Release.Name }}-dashboard-resources rules: +{{- if not (eq .Values.topology "Client") }} - apiGroups: - "" resources: @@ -27,13 +28,15 @@ rules: - {{ $.Release.Name }}-volume - {{ $.Release.Name }}-db verbs: ["get", "list", "watch"] +{{- end }} + --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: {{ .Release.Name }}-dashboard-resources subjects: -{{ include "cozy-lib.rbac.subjectsForTenantAndAccessLevel" (list "admin" .Release.Namespace) }} +{{ include "cozy-lib.rbac.subjectsForTenantAndAccessLevel" (list "super-admin" .Release.Namespace) }} roleRef: kind: Role name: {{ .Release.Name }}-dashboard-resources diff --git a/packages/extra/seaweedfs/templates/ingress.yaml b/packages/extra/seaweedfs/templates/ingress.yaml new file mode 100644 index 00000000..05bf201d --- /dev/null +++ b/packages/extra/seaweedfs/templates/ingress.yaml @@ -0,0 +1,44 @@ +{{- $cozyConfig := lookup "v1" "ConfigMap" "cozy-system" "cozystack" }} +{{- $issuerType := (index $cozyConfig.data "clusterissuer") | default "http01" }} + +{{- $myNS := lookup "v1" "Namespace" "" .Release.Namespace }} +{{- $ingress := index $myNS.metadata.annotations "namespace.cozystack.io/ingress" }} +{{- $host := index $myNS.metadata.annotations "namespace.cozystack.io/host" }} +{{- if and (not (eq .Values.topology "Client")) (.Values.filer.grpcHost) }} +--- +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + annotations: + nginx.ingress.kubernetes.io/backend-protocol: GRPCS + nginx.ingress.kubernetes.io/ssl-passthrough: "true" + nginx.ingress.kubernetes.io/whitelist-source-range: "{{ join "," (.Values.filer.whitelist | default "0.0.0.0/32") }}" + name: seaweedfs-filer-external +spec: + ingressClassName: tenant-root + rules: + - host: {{ .Values.filer.grpcHost | default (printf "filer.%s" $host) }} + http: + paths: + - backend: + service: + name: {{ $.Release.Name }}-filer-external + port: + number: 18888 + path: / + pathType: ImplementationSpecific +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ $.Release.Name }}-filer-external +spec: + ports: + - name: swfs-filer-grpc + port: 18888 + protocol: TCP + targetPort: 18888 + selector: + app.kubernetes.io/component: filer + app.kubernetes.io/name: {{ $.Release.Name }} +{{- end }} diff --git a/packages/extra/seaweedfs/templates/seaweedfs.yaml b/packages/extra/seaweedfs/templates/seaweedfs.yaml index eafdb4e3..9306bf61 100644 --- a/packages/extra/seaweedfs/templates/seaweedfs.yaml +++ b/packages/extra/seaweedfs/templates/seaweedfs.yaml @@ -1,6 +1,9 @@ {{- /* Preflight checks for Helm template */ -}} -{{- if not (has .Values.topology (list "Simple" "MultiZone")) }} -{{- fail "Invalid value for .Values.topology. Must be one of 'Simple' or 'MultiZone'." }} +{{- if not (has .Values.topology (list "Simple" "MultiZone" "Client")) }} +{{- fail "Invalid value for .Values.topology. Must be one of 'Simple', 'MultiZone' or 'Client'." }} +{{- end }} +{{- if and (eq .Values.topology "Client") (not .Values.filer.grpcHost) }} +{{- fail "When topology is 'Client', .Values.filer.grpcHost must be set to a valid remote filer GRPC service endpoint." }} {{- end }} {{- if lt (int .Values.replicationFactor) 1 }} {{- fail "Invalid value for .Values.replicationFactor. Must be at least 1." }} @@ -13,16 +16,24 @@ {{- fail "replicationFactor must be less than or equal to the number of zones defined in .Values.zones." }} {{- end }} {{- end }} -{{- if lookup "v1" "PersistentVolumeClaim" "" (printf "%s-data1-seaweedfs-volume-0" .Release.Name) }} -{{- if eq .Values.topology "MultiZone" }} -{{- fail "Not allowed to switch between Simple and MultiZone topologies after the first deployment." }} -{{- end }} + +{{- $detectedTopology := "Unknown" }} +{{- $configMap := lookup "v1" "ConfigMap" .Release.Namespace (printf "%s-deployed-topology" .Release.Name) }} +{{- if $configMap }} +{{- $detectedTopology = dig "data" "topology" "Unknown" $configMap }} {{- else }} -{{- if and (eq .Values.topology "Simple") (.Release.IsUpgrade) }} -{{- fail "Not allowed to switch between Simple and MultiZone topologies after the first deployment." }} +{{- if lookup "v1" "PersistentVolumeClaim" .Release.Namespace (printf "data1-%s-volume-0" .Release.Name) }} +{{- $detectedTopology = "Simple" }} +{{- else if lookup "apps/v1" "StatefulSet" .Release.Namespace (printf "%s-master" .Release.Name) }} +{{- $detectedTopology = "MultiZone" }} {{- end }} {{- end }} +{{- if not (has $detectedTopology (list .Values.topology "Unknown")) }} +{{- fail (printf "Not allowed to switch between topologies after the first deployment: %s" $detectedTopology) }} +{{- end }} + +{{- if not (eq .Values.topology "Client") }} {{- $myNS := lookup "v1" "Namespace" "" .Release.Namespace }} {{- $ingress := index $myNS.metadata.annotations "namespace.cozystack.io/ingress" }} {{- $host := index $myNS.metadata.annotations "namespace.cozystack.io/host" }} @@ -99,6 +110,7 @@ spec: {{- else if $.Values.storageClass }} storageClass: {{ $.Values.storageClass }} {{- end }} + maxVolumes: 0 nodeSelector: | topology.kubernetes.io/zone: {{ $zoneName }} dataCenter: {{ $zone.dataCenter | default $zoneName }} @@ -198,3 +210,4 @@ spec: cnpg.io/cluster: seaweedfs-db cnpg.io/podRole: instance version: {{ $.Chart.Version }} +{{- end }} diff --git a/packages/extra/seaweedfs/templates/vpa.yaml b/packages/extra/seaweedfs/templates/vpa.yaml index a0c6d6a7..acdd8f47 100644 --- a/packages/extra/seaweedfs/templates/vpa.yaml +++ b/packages/extra/seaweedfs/templates/vpa.yaml @@ -1,3 +1,4 @@ +{{- if not (eq .Values.topology "Client") }} apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: @@ -64,3 +65,4 @@ spec: maxAllowed: cpu: "1" memory: 2048Mi +{{- end }} diff --git a/packages/extra/seaweedfs/values.schema.json b/packages/extra/seaweedfs/values.schema.json index 2f6e48bd..e822eda0 100644 --- a/packages/extra/seaweedfs/values.schema.json +++ b/packages/extra/seaweedfs/values.schema.json @@ -1,5 +1,26 @@ { "properties": { + "filer": { + "properties": { + "grpcHost": { + "default": "", + "description": "The hostname used to expose or access the filer service externally.", + "type": "string" + }, + "grpcPort": { + "default": 443, + "description": "The port used to access the filer service externally.", + "type": "number" + }, + "whitelist": { + "default": [], + "description": "A list of IP addresses or CIDR ranges that are allowed to access the filer service.", + "items": {}, + "type": "array" + } + }, + "type": "object" + }, "host": { "default": "", "description": "The hostname used to access the SeaweedFS externally (defaults to 's3' subdomain for the tenant host).", @@ -27,11 +48,12 @@ }, "topology": { "default": "Simple", - "description": "The topology of the SeaweedFS cluster. (allowed values: Simple, MultiZone)", + "description": "The topology of the SeaweedFS cluster. (allowed values: Simple, MultiZone, Client)", "type": "string", "enum": [ "Simple", - "MultiZone" + "MultiZone", + "Client" ] }, "zones": { diff --git a/packages/extra/seaweedfs/values.yaml b/packages/extra/seaweedfs/values.yaml index 50846fcc..c1f73a53 100644 --- a/packages/extra/seaweedfs/values.yaml +++ b/packages/extra/seaweedfs/values.yaml @@ -3,7 +3,7 @@ ## @param host The hostname used to access the SeaweedFS externally (defaults to 's3' subdomain for the tenant host). host: "" -## @param topology The topology of the SeaweedFS cluster. (allowed values: Simple, MultiZone) +## @param topology The topology of the SeaweedFS cluster. (allowed values: Simple, MultiZone, Client) ## topology: Simple @@ -31,3 +31,11 @@ storageClass: "" ## replicas: 2 ## size: 10Gi zones: {} + +## @param filer.grpcHost The hostname used to expose or access the filer service externally. +## @param filer.grpcPort The port used to access the filer service externally. +## @param filer.whitelist A list of IP addresses or CIDR ranges that are allowed to access the filer service. +filer: + grpcHost: "" + grpcPort: 443 + whitelist: [] diff --git a/packages/extra/versions_map b/packages/extra/versions_map index cb9683bb..573257d3 100644 --- a/packages/extra/versions_map +++ b/packages/extra/versions_map @@ -13,7 +13,8 @@ etcd 2.6.0 8c460528 etcd 2.6.1 45a7416c etcd 2.7.0 632224a3 etcd 2.8.0 4369b031 -etcd 2.9.0 HEAD +etcd 2.9.0 8ddbe32e +etcd 2.9.1 HEAD info 1.0.0 93bdf411 info 1.0.1 632224a3 info 1.1.0 HEAD @@ -54,4 +55,5 @@ seaweedfs 0.2.1 fde4bcfa seaweedfs 0.3.0 45a7416c seaweedfs 0.4.0 632224a3 seaweedfs 0.4.1 8c86905b -seaweedfs 0.5.0 HEAD +seaweedfs 0.5.0 9584e5f5 +seaweedfs 0.6.0 HEAD diff --git a/packages/system/bucket/images/s3manager.tag b/packages/system/bucket/images/s3manager.tag index 35e8e1ce..4f804386 100644 --- a/packages/system/bucket/images/s3manager.tag +++ b/packages/system/bucket/images/s3manager.tag @@ -1 +1 @@ -ghcr.io/cozystack/cozystack/s3manager:v0.5.0@sha256:208d8ea43b4b493ee0bea80606f6b3041a02460be79c52ed12aecccd35ec2a02 +ghcr.io/cozystack/cozystack/s3manager:v0.5.0@sha256:a9c0a5d5519b2da200d7d035fe30087ea4834fc8013a482848c160610b5b9716 diff --git a/packages/system/cozystack-api/values.yaml b/packages/system/cozystack-api/values.yaml index d386967e..a254eed9 100644 --- a/packages/system/cozystack-api/values.yaml +++ b/packages/system/cozystack-api/values.yaml @@ -1,2 +1,2 @@ cozystackAPI: - image: ghcr.io/cozystack/cozystack/cozystack-api:v0.34.0@sha256:dad88c168719dcaa0b2e6bab352a90f44f4e23c58f525f96841cfce357920bdf + image: ghcr.io/cozystack/cozystack/cozystack-api:v0.34.8@sha256:86ef89a7be84761038cc25507a1b6e195c9f86c8051ac8aca8044dd8de39dedb diff --git a/packages/system/cozystack-controller/values.yaml b/packages/system/cozystack-controller/values.yaml index 5dc3e593..d52183b4 100644 --- a/packages/system/cozystack-controller/values.yaml +++ b/packages/system/cozystack-controller/values.yaml @@ -1,5 +1,5 @@ cozystackController: - image: ghcr.io/cozystack/cozystack/cozystack-controller:v0.34.0@sha256:ef725447d1ddadbceb5218d6a2eb68b5fbace838173fbe00eb67ba72662ad171 + image: ghcr.io/cozystack/cozystack/cozystack-controller:v0.34.8@sha256:cd4082e3672e793cbead467041ffb372d465085653614885f109fc7c582cd112 debug: false disableTelemetry: false - cozystackVersion: "v0.34.0" + cozystackVersion: "v0.34.8" diff --git a/packages/system/dashboard/charts/kubeapps/templates/dashboard/configmap.yaml b/packages/system/dashboard/charts/kubeapps/templates/dashboard/configmap.yaml index 6cbe1d73..75aae0d4 100644 --- a/packages/system/dashboard/charts/kubeapps/templates/dashboard/configmap.yaml +++ b/packages/system/dashboard/charts/kubeapps/templates/dashboard/configmap.yaml @@ -76,7 +76,7 @@ data: "kubeappsNamespace": {{ .Release.Namespace | quote }}, "helmGlobalNamespace": {{ include "kubeapps.helmGlobalPackagingNamespace" . | quote }}, "carvelGlobalNamespace": {{ .Values.kubeappsapis.pluginConfig.kappController.packages.v1alpha1.globalPackagingNamespace | quote }}, - "appVersion": "v0.34.0", + "appVersion": "v0.34.8", "authProxyEnabled": {{ .Values.authProxy.enabled }}, "oauthLoginURI": {{ .Values.authProxy.oauthLoginURI | quote }}, "oauthLogoutURI": {{ .Values.authProxy.oauthLogoutURI | quote }}, diff --git a/packages/system/dashboard/images/dashboard/Dockerfile b/packages/system/dashboard/images/dashboard/Dockerfile index 633d9e7f..48656a2c 100644 --- a/packages/system/dashboard/images/dashboard/Dockerfile +++ b/packages/system/dashboard/images/dashboard/Dockerfile @@ -1,7 +1,7 @@ FROM bitnami/node:20.15.1 AS build WORKDIR /app -ARG COMMIT_REF=cdf9095f50c74505870de337725d2a9d0bd20947 +ARG COMMIT_REF=4926bc68fabb0914afab574006643c85a597b371 RUN wget -O- https://github.com/cozystack/kubeapps/archive/${COMMIT_REF}.tar.gz | tar xzf - --strip-components=2 kubeapps-${COMMIT_REF}/dashboard RUN yarn install --frozen-lockfile diff --git a/packages/system/dashboard/images/kubeapps-apis/Dockerfile b/packages/system/dashboard/images/kubeapps-apis/Dockerfile index 619f9386..a525a170 100644 --- a/packages/system/dashboard/images/kubeapps-apis/Dockerfile +++ b/packages/system/dashboard/images/kubeapps-apis/Dockerfile @@ -4,7 +4,7 @@ # syntax = docker/dockerfile:1 FROM alpine AS source -ARG COMMIT_REF=cdf9095f50c74505870de337725d2a9d0bd20947 +ARG COMMIT_REF=4926bc68fabb0914afab574006643c85a597b371 RUN apk add --no-cache patch WORKDIR /source RUN wget -O- https://github.com/cozystack/kubeapps/archive/${COMMIT_REF}.tar.gz | tar xzf - --strip-components=1 diff --git a/packages/system/dashboard/values.yaml b/packages/system/dashboard/values.yaml index 75ed3640..1dc81f99 100644 --- a/packages/system/dashboard/values.yaml +++ b/packages/system/dashboard/values.yaml @@ -19,8 +19,8 @@ kubeapps: image: registry: ghcr.io/cozystack/cozystack repository: dashboard - tag: v0.34.0 - digest: "sha256:ad4b95660b6c5c1b9736ca4768a3f9648705c2855d0a08880d570b4e480dba78" + tag: v0.34.8 + digest: "sha256:54906b3d2492c8603a347a5938b6db36e5ed5c4149111cae1804ac9110361947" redis: master: resourcesPreset: "none" @@ -37,8 +37,8 @@ kubeapps: image: registry: ghcr.io/cozystack/cozystack repository: kubeapps-apis - tag: v0.34.0 - digest: "sha256:9f376d82db6802af32d137fef722237e1037e92ac8feb39131fcdfb5a0b02d30" + tag: v0.34.8 + digest: "sha256:6a02c7ef1e851118472e80ec7dac961e7637a6d32f4bd35dc1d2f0b32bf217a3" pluginConfig: flux: packages: diff --git a/packages/system/kamaji/Makefile b/packages/system/kamaji/Makefile index aa864c1a..55921018 100644 --- a/packages/system/kamaji/Makefile +++ b/packages/system/kamaji/Makefile @@ -27,4 +27,5 @@ image: yq -i '.kamaji.image.repository = strenv(REPOSITORY)' values.yaml TAG=$(TAG)@$$(yq e '."containerimage.digest"' images/kamaji.json -o json -r) \ yq -i '.kamaji.image.tag = strenv(TAG)' values.yaml + yq -i '.kamaji.extraArgs[0] = "--migrate-image=" + .kamaji.image.repository + ":" + .kamaji.image.tag' values.yaml rm -f images/kamaji.json diff --git a/packages/system/kamaji/values.yaml b/packages/system/kamaji/values.yaml index 7057c5e1..c78de471 100644 --- a/packages/system/kamaji/values.yaml +++ b/packages/system/kamaji/values.yaml @@ -3,7 +3,7 @@ kamaji: deploy: false image: pullPolicy: IfNotPresent - tag: v0.34.0@sha256:09465ae8285b4ae43203581e443409cd4e1e119dde62a5c14d63ce064fb840b0 + tag: v0.34.8@sha256:908dc829ce8493607dffcf6de95e4993ff2bfc0d65949c501bd7119fad45127a repository: ghcr.io/cozystack/cozystack/kamaji resources: limits: @@ -12,3 +12,5 @@ kamaji: requests: cpu: 100m memory: 100Mi + extraArgs: + - --migrate-image=ghcr.io/cozystack/cozystack/kamaji:v0.34.8@sha256:908dc829ce8493607dffcf6de95e4993ff2bfc0d65949c501bd7119fad45127a diff --git a/packages/system/keycloak-configure/templates/configure-kk.yaml b/packages/system/keycloak-configure/templates/configure-kk.yaml index adee11b6..c49a3889 100644 --- a/packages/system/keycloak-configure/templates/configure-kk.yaml +++ b/packages/system/keycloak-configure/templates/configure-kk.yaml @@ -200,7 +200,7 @@ spec: - groups - kubernetes-client redirectUris: - - "http://dashboard.{{ $host }}/oauth2/callback/*" + - "https://dashboard.{{ $host }}/oauth2/callback/*" {{- range $i, $v := $extraRedirectUris }} - "{{ $v }}" {{- end }} @@ -223,8 +223,7 @@ data: clientSecret: {{ $kubeappsClient }} cookieSecret: {{ $cookieSecret }} extraFlags: - - --ssl-insecure-skip-verify - - --cookie-secure=false + - --cookie-secure - --scope=openid email groups - --oidc-issuer-url=https://keycloak.{{ $host }}/realms/cozy diff --git a/packages/system/kubeovn-webhook/values.yaml b/packages/system/kubeovn-webhook/values.yaml index ea59780f..7a64ee68 100644 --- a/packages/system/kubeovn-webhook/values.yaml +++ b/packages/system/kubeovn-webhook/values.yaml @@ -1,3 +1,3 @@ portSecurity: true routes: "" -image: ghcr.io/cozystack/cozystack/kubeovn-webhook:v0.34.0@sha256:b7841916659646823f556b7ce299f6ed55a2d10ca81736c19e721a890efd4694 +image: ghcr.io/cozystack/cozystack/kubeovn-webhook:v0.34.8@sha256:e6c845b65142d554d34187aef29afcbd8f67fae7dcc787255fb53de2b6103386 diff --git a/packages/system/kubeovn/values.yaml b/packages/system/kubeovn/values.yaml index 7a75d75f..75428a73 100644 --- a/packages/system/kubeovn/values.yaml +++ b/packages/system/kubeovn/values.yaml @@ -64,4 +64,4 @@ global: images: kubeovn: repository: kubeovn - tag: v1.13.14@sha256:8409b093deada39a210784fd96461f16c1b1d5ae50e8a2285416b36a8ff6e13e + tag: v1.13.14@sha256:0f27c268300fe30fe3ad61d145fdb276d5dddba2d792aacc26f3f512f7ef205d diff --git a/packages/system/volumesnapshot-crd-for-tenant-k8s/templates/volumesnapshotclass.yaml b/packages/system/kubevirt-csi-node/templates/volumesnapshotclass.yaml similarity index 100% rename from packages/system/volumesnapshot-crd-for-tenant-k8s/templates/volumesnapshotclass.yaml rename to packages/system/kubevirt-csi-node/templates/volumesnapshotclass.yaml diff --git a/packages/system/kubevirt-csi-node/values.yaml b/packages/system/kubevirt-csi-node/values.yaml index 2413c033..0966c50d 100644 --- a/packages/system/kubevirt-csi-node/values.yaml +++ b/packages/system/kubevirt-csi-node/values.yaml @@ -1,3 +1,3 @@ storageClass: replicated csiDriver: - image: ghcr.io/cozystack/cozystack/kubevirt-csi-driver:0.26.0@sha256:445c2727b04ac68595b43c988ff17b3d69a7b22b0644fde3b10c65b47a7bc036 + image: ghcr.io/cozystack/cozystack/kubevirt-csi-driver:0.26.3@sha256:df3a2f503b4a035567b20b81a0f105c15971274fd675101c3b3eb2413d966d2e diff --git a/packages/system/linstor/templates/podscrape.yaml b/packages/system/linstor/templates/podscrape.yaml index 9c334527..786bc687 100644 --- a/packages/system/linstor/templates/podscrape.yaml +++ b/packages/system/linstor/templates/podscrape.yaml @@ -37,7 +37,7 @@ spec: - replacement: linstor-satellite targetLabel: job - sourceLabels: [__meta_kubernetes_pod_node_name] - targetLabel: node + targetLabel: controller_node - targetLabel: tier replacement: cluster selector: diff --git a/packages/system/objectstorage-controller/Makefile b/packages/system/objectstorage-controller/Makefile index b947ce36..96bb664c 100644 --- a/packages/system/objectstorage-controller/Makefile +++ b/packages/system/objectstorage-controller/Makefile @@ -24,6 +24,6 @@ image-controller image-sidecar: --metadata-file images/$(TARGET).json \ --push=$(PUSH) --provenance=false --load=$(LOAD) \ --label "org.opencontainers.image.source=https://github.com/cozystack/cozystack" - IMAGE="$(REGISTRY)/objectstorage-$(TARGET):$(call settag,$(TAG))@$$(yq e '."containerimage.digest"' images/$(TARGET).json -r)" && \ + IMAGE="$(REGISTRY)/objectstorage-$(TARGET):$(call settag,$(TAG))@$$(yq e '."containerimage.digest"' images/$(TARGET).json -r)" \ yq -i '$(YAML_PATH) = strenv(IMAGE)' $(VALUES_FILE) rm -f images/$(TARGET).json diff --git a/packages/system/objectstorage-controller/values.yaml b/packages/system/objectstorage-controller/values.yaml index 0a649151..49568418 100644 --- a/packages/system/objectstorage-controller/values.yaml +++ b/packages/system/objectstorage-controller/values.yaml @@ -1,3 +1,3 @@ objectstorage: controller: - image: "ghcr.io/cozystack/cozystack/objectstorage-controller:latest@sha256:173067339794fbf94534132eec5968b5fb6718037b77aefa00fd70b7413a8d4c" + image: "ghcr.io/cozystack/cozystack/objectstorage-controller:v0.34.8@sha256:5891c7fb46fb7c6ada4abc4e78e69b34631d13e32a30a86c0abc15cc17675450" diff --git a/packages/system/seaweedfs/values.yaml b/packages/system/seaweedfs/values.yaml index f7e3c5d9..d6eb91c9 100644 --- a/packages/system/seaweedfs/values.yaml +++ b/packages/system/seaweedfs/values.yaml @@ -4,34 +4,28 @@ global: extraEnvironmentVars: WEED_CLUSTER_SW_MASTER: "seaweedfs-master:9333" WEED_CLUSTER_SW_FILER: "seaweedfs-filer-client:8888" - seaweedfs: master: + volumeSizeLimitMB: 30000 replicas: 3 - volumeSizeLimitMB: 100 # replication type is XYZ: # X number of replica in other data centers # Y number of replica in other racks in the same data center # Z number of replica in other servers in the same rack defaultReplication: "001" - data: type: "emptyDir" - logs: type: "" - volume: replicas: 2 # minimum free disk space(in percents). If free disk space lower this value - all volumes marks as ReadOnly minFreeSpacePercent: 5 - dataDirs: - - name: data1 - type: "persistentVolumeClaim" - size: "10Gi" - maxVolumes: 0 - + - name: data1 + type: "persistentVolumeClaim" + size: "10Gi" + maxVolumes: 0 filer: replicas: 2 # replication type is XYZ: @@ -41,10 +35,8 @@ seaweedfs: defaultReplicaPlacement: "001" data: type: "emptyDir" - logs: type: "" - extraEnvironmentVars: WEED_LEVELDB2_ENABLED: "false" WEED_POSTGRES2_ENABLED: "true" @@ -73,7 +65,6 @@ seaweedfs: secretKeyRef: key: password name: seaweedfs-db-app - s3: enabled: true port: 8333 @@ -86,27 +77,25 @@ seaweedfs: # should have a secret key called seaweedfs_s3_config with an inline json configure existingConfigSecret: null auditLogConfig: {} - s3: enableAuth: true - logs: type: "" - ingress: enabled: true className: "tenant-root" host: "seaweedfs2.demo.cozystack.io" annotations: nginx.ingress.kubernetes.io/proxy-body-size: "0" + nginx.ingress.kubernetes.io/proxy-buffering: "off" + nginx.ingress.kubernetes.io/proxy-request-buffering: "off" nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" acme.cert-manager.io/http01-ingress-class: tenant-root cert-manager.io/cluster-issuer: letsencrypt-prod tls: - hosts: - - seaweedfs.demo.cozystack.io + - seaweedfs.demo.cozystack.io secretName: seaweedfs-s3-ingress-tls - cosi: enabled: true podLabels: @@ -114,14 +103,12 @@ seaweedfs: driverName: "seaweedfs.objectstorage.k8s.io" bucketClassName: "seaweedfs" region: "" - sidecar: - image: "ghcr.io/kvaps/test:cosi-provisioner-sidecar-25" - + image: "ghcr.io/cozystack/cozystack/objectstorage-sidecar:v0.34.8@sha256:ccc7ec31b2beebf09413b9a41ffa8fd06899510127572c9e1c1e30ddab45ebe9" certificates: commonName: "SeaweedFS CA" ipAddresses: [] keyAlgorithm: RSA keySize: 2048 - duration: 2160h # 90d - renewBefore: 360h # 15d + duration: 2160h # 90d + renewBefore: 360h # 15d diff --git a/packages/system/volumesnapshot-crd-for-tenant-k8s/Chart.yaml b/packages/system/volumesnapshot-crd-for-tenant-k8s/Chart.yaml index 46aa7f59..42d950ed 100644 --- a/packages/system/volumesnapshot-crd-for-tenant-k8s/Chart.yaml +++ b/packages/system/volumesnapshot-crd-for-tenant-k8s/Chart.yaml @@ -1,3 +1,3 @@ apiVersion: v2 -name: cozy-volumesnapshot-crd-for-tenant-k8s +name: cozy-vsnap-crd version: 0.0.0 # Placeholder, the actual version will be automatically set during the build process diff --git a/packages/system/volumesnapshot-crd-for-tenant-k8s/Makefile b/packages/system/volumesnapshot-crd-for-tenant-k8s/Makefile index e45b7069..57e5a290 100644 --- a/packages/system/volumesnapshot-crd-for-tenant-k8s/Makefile +++ b/packages/system/volumesnapshot-crd-for-tenant-k8s/Makefile @@ -1,4 +1,4 @@ -export NAME=volumesnapshot-crd-for-tenant-k8s +export NAME=vsnap-crd export NAMESPACE=cozy-$(NAME) include ../../../scripts/package.mk diff --git a/pkg/registry/apps/application/rest.go b/pkg/registry/apps/application/rest.go index 4b80daa3..8cd246eb 100644 --- a/pkg/registry/apps/application/rest.go +++ b/pkg/registry/apps/application/rest.go @@ -254,7 +254,6 @@ func (r *REST) List(ctx context.Context, options *metainternalversion.ListOption klog.Errorf("Invalid field selector: %v", err) return nil, fmt.Errorf("invalid field selector: %v", err) } - // Check if selector is for metadata.name if name, exists := fs.RequiresExactMatch("metadata.name"); exists { // Convert Application name to HelmRelease name @@ -304,17 +303,8 @@ func (r *REST) List(ctx context.Context, options *metainternalversion.ListOption return nil, err } - // Initialize empty Application list - appList := &appsv1alpha1.ApplicationList{ - TypeMeta: metav1.TypeMeta{ - APIVersion: "apps.cozystack.io/v1alpha1", - Kind: "ApplicationList", - }, - ListMeta: metav1.ListMeta{ - ResourceVersion: hrList.GetResourceVersion(), - }, - Items: []appsv1alpha1.Application{}, - } + // Initialize unstructured items array + items := make([]unstructured.Unstructured, 0) // Iterate over HelmReleases and convert to Applications for _, hr := range hrList.Items { @@ -352,7 +342,6 @@ func (r *REST) List(ctx context.Context, options *metainternalversion.ListOption klog.Errorf("Invalid field selector: %v", err) continue } - fieldsSet := fields.Set{ "metadata.name": app.Name, "metadata.namespace": app.Namespace, @@ -362,10 +351,23 @@ func (r *REST) List(ctx context.Context, options *metainternalversion.ListOption } } - appList.Items = append(appList.Items, app) + // Convert Application to unstructured + unstructuredApp, err := runtime.DefaultUnstructuredConverter.ToUnstructured(&app) + if err != nil { + klog.Errorf("Error converting Application %s to unstructured: %v", app.Name, err) + continue + } + items = append(items, unstructured.Unstructured{Object: unstructuredApp}) } - klog.V(6).Infof("Successfully listed %d Application resources in namespace %s", len(appList.Items), namespace) + // Explicitly set apiVersion and kind in unstructured object + appList := &unstructured.UnstructuredList{} + appList.SetAPIVersion("apps.cozystack.io/v1alpha1") + appList.SetKind(r.kindName + "List") + appList.SetResourceVersion(hrList.GetResourceVersion()) + appList.Items = items + + klog.V(6).Infof("Successfully listed %d Application resources in namespace %s", len(items), namespace) return appList, nil } @@ -1015,6 +1017,19 @@ func (r *REST) ConvertToTable(ctx context.Context, object runtime.Object, tableO case *appsv1alpha1.Application: table = r.buildTableFromApplication(*obj) table.ListMeta.ResourceVersion = obj.GetResourceVersion() + case *unstructured.UnstructuredList: + apps := make([]appsv1alpha1.Application, 0, len(obj.Items)) + for _, u := range obj.Items { + var a appsv1alpha1.Application + err := runtime.DefaultUnstructuredConverter.FromUnstructured(u.Object, &a) + if err != nil { + klog.Errorf("Failed to convert Unstructured to Application: %v", err) + continue + } + apps = append(apps, a) + } + table = r.buildTableFromApplications(apps) + table.ListMeta.ResourceVersion = obj.GetResourceVersion() case *unstructured.Unstructured: var app appsv1alpha1.Application err := runtime.DefaultUnstructuredConverter.FromUnstructured(obj.UnstructuredContent(), &app) @@ -1046,7 +1061,6 @@ func (r *REST) ConvertToTable(ctx context.Context, object runtime.Object, tableO } klog.V(6).Infof("ConvertToTable: returning table with %d rows", len(table.Rows)) - return &table, nil } diff --git a/scripts/migrations/17 b/scripts/migrations/17 new file mode 100755 index 00000000..9749c0e2 --- /dev/null +++ b/scripts/migrations/17 @@ -0,0 +1,10 @@ +#!/bin/sh +# Migration 17 --> 18 + +# Upgrade kubernetes.apps to new chart version +kubectl get kuberneteses.apps.cozystack.io -A --no-headers --output=custom-columns='NAMESPACE:.metadata.namespace,NAME:.metadata.name' | while read NAMESPACE NAME; do + kubectl patch kuberneteses.apps.cozystack.io -n "$NAMESPACE" "$NAME" --type merge -p '{"appVersion":"0.26.1"}' +done + +# Write version to cozystack-version config +kubectl create configmap -n cozy-system cozystack-version --from-literal=version=18 --dry-run=client -o yaml | kubectl apply -f-