From 1521eb4ca8c40a65062dd1be32b3e322ca406802 Mon Sep 17 00:00:00 2001 From: Nicolas Bigler Date: Tue, 17 Feb 2026 17:29:20 +0100 Subject: [PATCH] Initial poc for virtuozzo Signed-off-by: Nicolas Bigler --- cmd/functions.go | 1 + go.mod | 27 +++-- go.sum | 50 ++++---- .../buckets/virtuozzobucket/register.go | 17 +++ .../virtuozzobucket/virtuozzobucket.go | 111 ++++++++++++++++++ .../virtuozzobucket/virtuozzobucket_test.go | 62 ++++++++++ pkg/scheme.go | 2 + .../virtuozzobucket/bucket-existing.yaml | 29 +++++ .../virtuozzobucket/bucket-no-name.yaml | 22 ++++ test/functions/virtuozzobucket/bucket.yaml | 22 ++++ 10 files changed, 309 insertions(+), 34 deletions(-) create mode 100644 pkg/comp-functions/functions/buckets/virtuozzobucket/register.go create mode 100644 pkg/comp-functions/functions/buckets/virtuozzobucket/virtuozzobucket.go create mode 100644 pkg/comp-functions/functions/buckets/virtuozzobucket/virtuozzobucket_test.go create mode 100644 test/functions/virtuozzobucket/bucket-existing.yaml create mode 100644 test/functions/virtuozzobucket/bucket-no-name.yaml create mode 100644 test/functions/virtuozzobucket/bucket.yaml diff --git a/cmd/functions.go b/cmd/functions.go index b952be0fd6..f2df5b0c63 100644 --- a/cmd/functions.go +++ b/cmd/functions.go @@ -8,6 +8,7 @@ import ( _ "github.com/vshn/appcat/v4/pkg/comp-functions/functions/buckets/cloudscalebucket" _ "github.com/vshn/appcat/v4/pkg/comp-functions/functions/buckets/exoscalebucket" _ "github.com/vshn/appcat/v4/pkg/comp-functions/functions/buckets/miniobucket" + _ "github.com/vshn/appcat/v4/pkg/comp-functions/functions/buckets/virtuozzobucket" _ "github.com/vshn/appcat/v4/pkg/comp-functions/functions/spks/spksmariadb" _ "github.com/vshn/appcat/v4/pkg/comp-functions/functions/spks/spksredis" _ "github.com/vshn/appcat/v4/pkg/comp-functions/functions/vshnforgejo" diff --git a/go.mod b/go.mod index e82d9f0968..9b522b6aae 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/vshn/appcat/v4 -go 1.23 +go 1.23.0 toolchain go1.24.0 @@ -29,7 +29,7 @@ require ( github.com/iancoleman/strcase v0.2.0 github.com/jackc/pgx/v5 v5.7.1 github.com/k8up-io/k8up/v2 v2.7.1 - github.com/minio/minio-go/v7 v7.0.70 + github.com/minio/minio-go/v7 v7.0.91 github.com/ory/dockertest v3.3.5+incompatible github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring v0.63.0 github.com/prometheus/client_golang v1.20.2 @@ -43,9 +43,10 @@ require ( github.com/vshn/provider-cloudscale v0.5.2 github.com/vshn/provider-exoscale v0.11.2-0.20240730092820-016cddb3d704 github.com/vshn/provider-minio v0.3.0 + github.com/vshn/provider-virtuozzo v0.0.0-20260216152851-dac9b3bda8e5 go.uber.org/mock v0.4.0 go.uber.org/zap v1.27.0 - golang.org/x/text v0.22.0 + golang.org/x/text v0.25.0 google.golang.org/grpc v1.67.1 gotest.tools/v3 v3.1.0 k8s.io/api v0.31.2 @@ -126,10 +127,11 @@ require ( github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.6.0 // indirect github.com/go-git/go-git/v5 v5.13.0 // indirect + github.com/go-ini/ini v1.67.0 // indirect github.com/go-json-experiment/json v0.0.0-20240815175050-ebd3a8989ca1 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/gobuffalo/flect v1.0.3 // indirect - github.com/goccy/go-json v0.10.2 // indirect + github.com/goccy/go-json v0.10.5 // indirect github.com/golang-jwt/jwt/v4 v4.5.1 // indirect github.com/golang-jwt/jwt/v5 v5.2.1 // indirect github.com/google/cel-go v0.21.0 // indirect @@ -152,6 +154,7 @@ require ( github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect + github.com/minio/crc64nvme v1.0.2 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/moby/docker-image-spec v1.3.1 // indirect github.com/moby/term v0.5.0 // indirect @@ -234,8 +237,8 @@ require ( github.com/jackc/puddle/v2 v2.2.2 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.17.10 // indirect - github.com/klauspost/cpuid/v2 v2.2.6 // indirect + github.com/klauspost/compress v1.18.0 // indirect + github.com/klauspost/cpuid/v2 v2.2.10 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/minio/md5-simd v1.1.2 // indirect @@ -251,21 +254,21 @@ require ( github.com/prometheus/client_model v0.6.1 github.com/prometheus/procfs v0.15.1 // indirect github.com/redis/go-redis/v9 v9.0.5 - github.com/rs/xid v1.5.0 // indirect + github.com/rs/xid v1.6.0 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/spf13/afero v1.11.0 // indirect github.com/spf13/cast v1.6.0 // indirect github.com/spf13/pflag v1.0.5 github.com/subosito/gotenv v1.6.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.33.0 // indirect + golang.org/x/crypto v0.38.0 // indirect golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 // indirect golang.org/x/mod v0.21.0 // indirect - golang.org/x/net v0.33.0 // indirect + golang.org/x/net v0.40.0 // indirect golang.org/x/oauth2 v0.22.0 - golang.org/x/sync v0.11.0 // indirect - golang.org/x/sys v0.30.0 // indirect - golang.org/x/term v0.29.0 // indirect + golang.org/x/sync v0.14.0 // indirect + golang.org/x/sys v0.33.0 // indirect + golang.org/x/term v0.32.0 // indirect golang.org/x/time v0.6.0 golang.org/x/tools v0.26.0 // indirect gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 391b17302e..fc6b07fef5 100644 --- a/go.sum +++ b/go.sum @@ -240,6 +240,8 @@ github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMj github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= github.com/go-git/go-git/v5 v5.13.0 h1:vLn5wlGIh/X78El6r3Jr+30W16Blk0CTcxTYcYPWi5E= github.com/go-git/go-git/v5 v5.13.0/go.mod h1:Wjo7/JyVKtQgUNdXYXIepzWfJQkUEIGvkvVkiXRR/zw= +github.com/go-ini/ini v1.67.0 h1:z6ZrTEZqSWOTyH2FlglNbNgARyHG8oLW9gMELqKr06A= +github.com/go-ini/ini v1.67.0/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8= github.com/go-json-experiment/json v0.0.0-20240815175050-ebd3a8989ca1 h1:xcuWappghOVI8iNWoF2OKahVejd1LSVi/v4JED44Amo= github.com/go-json-experiment/json v0.0.0-20240815175050-ebd3a8989ca1/go.mod h1:BWmvoE1Xia34f3l/ibJweyhrT+aROb/FQ6d+37F0e2s= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -272,8 +274,8 @@ github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZ github.com/gobuffalo/flect v1.0.3 h1:xeWBM2nui+qnVvNM4S3foBhCAL2XgPU+a7FdpelbTq4= github.com/gobuffalo/flect v1.0.3/go.mod h1:A5msMlrHtLqh9umBSnvabjsMrCcCpAyzglnDvkbYKHs= github.com/goccy/go-json v0.7.8/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= @@ -403,11 +405,11 @@ github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4 github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.17.10 h1:oXAz+Vh0PMUvJczoi+flxpnBEPxoER1IaAnU/NMPtT0= -github.com/klauspost/compress v1.17.10/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.2.6 h1:ndNyv040zDGIDh8thGkXYjnFtiN02M1PVVF+JE/48xc= -github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE= +github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= @@ -456,10 +458,12 @@ github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27k github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/minio/crc64nvme v1.0.2 h1:6uO1UxGAD+kwqWWp7mBFsi5gAse66C4NXO8cmcVculg= +github.com/minio/crc64nvme v1.0.2/go.mod h1:eVfm2fAzLlxMdUGc0EEBGSMmPwmXD5XiNRpnu9J3bvg= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.70 h1:1u9NtMgfK1U42kUxcsl5v0yj6TEOPR497OAQxpJnn2g= -github.com/minio/minio-go/v7 v7.0.70/go.mod h1:4yBA8v80xGA30cfM3fz0DKYMXunWl/AV/6tWEs9ryzo= +github.com/minio/minio-go/v7 v7.0.91 h1:tWLZnEfo3OZl5PoXQwcwTAPNNrjyWwOh6cbZitW5JQc= +github.com/minio/minio-go/v7 v7.0.91/go.mod h1:uvMUcGrpgeSAAI6+sD3818508nUyMULw94j2Nxku/Go= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= @@ -538,8 +542,8 @@ github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6po github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= -github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU= +github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= github.com/rs/zerolog v1.29.0 h1:Zes4hju04hjbvkVkOhdl2HpZa+0PmVwigmo8XoORE5w= github.com/rs/zerolog v1.29.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -634,6 +638,8 @@ github.com/vshn/provider-exoscale v0.11.2-0.20240730092820-016cddb3d704 h1:gXLl9 github.com/vshn/provider-exoscale v0.11.2-0.20240730092820-016cddb3d704/go.mod h1:CWT3tVmb6hYkog+yh5z+jxOGiscwkPxlZ14kueQci1E= github.com/vshn/provider-minio v0.3.0 h1:2p3vN5fsWMjFyElxIX4W74R/i0BchWnHQOeIvvz2u8E= github.com/vshn/provider-minio v0.3.0/go.mod h1:wkYcIc6FAVIDmZfBzlBCZQsXtcvIoRIuEFS6VyxYCY8= +github.com/vshn/provider-virtuozzo v0.0.0-20260216152851-dac9b3bda8e5 h1:rzeICVa+whg82mHf4bboCh0Zmpadsd6SvwD9OCcjp/Q= +github.com/vshn/provider-virtuozzo v0.0.0-20260216152851-dac9b3bda8e5/go.mod h1:zQPb6Kl0aVuHRdJIE7nLuBMoGfqO81vQSIT3ipTzShw= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= @@ -704,8 +710,8 @@ golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= -golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= -golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= +golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= +golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= golang.org/x/exp v0.0.0-20240909161429-701f63a606c0 h1:e66Fs6Z+fZTbFBAxKfP3PALWBtpfqks2bwGcexMxgtk= golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -725,8 +731,8 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= -golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= +golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= +golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= golang.org/x/oauth2 v0.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA= golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -735,8 +741,8 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= -golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ= +golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -765,22 +771,22 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= -golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= -golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= +golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg= +golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= -golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= +golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= +golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U= diff --git a/pkg/comp-functions/functions/buckets/virtuozzobucket/register.go b/pkg/comp-functions/functions/buckets/virtuozzobucket/register.go new file mode 100644 index 0000000000..00769673a1 --- /dev/null +++ b/pkg/comp-functions/functions/buckets/virtuozzobucket/register.go @@ -0,0 +1,17 @@ +package virtuozzobucket + +import ( + appcatv1 "github.com/vshn/appcat/v4/apis/v1" + "github.com/vshn/appcat/v4/pkg/comp-functions/runtime" +) + +func init() { + runtime.RegisterService[*appcatv1.ObjectBucket]("virtuozzobucket", runtime.Service[*appcatv1.ObjectBucket]{ + Steps: []runtime.Step[*appcatv1.ObjectBucket]{ + { + Name: "provision-bucket", + Execute: ProvisionVirtuozzobucket, + }, + }, + }) +} diff --git a/pkg/comp-functions/functions/buckets/virtuozzobucket/virtuozzobucket.go b/pkg/comp-functions/functions/buckets/virtuozzobucket/virtuozzobucket.go new file mode 100644 index 0000000000..4c5b480784 --- /dev/null +++ b/pkg/comp-functions/functions/buckets/virtuozzobucket/virtuozzobucket.go @@ -0,0 +1,111 @@ +package virtuozzobucket + +import ( + "context" + "fmt" + + xpv1 "github.com/crossplane/crossplane-runtime/apis/common/v1" + xfnproto "github.com/crossplane/function-sdk-go/proto/v1" + appcatv1 "github.com/vshn/appcat/v4/apis/v1" + "github.com/vshn/appcat/v4/pkg/comp-functions/functions/buckets/util" + "github.com/vshn/appcat/v4/pkg/comp-functions/runtime" + virtuozzov1 "github.com/vshn/provider-virtuozzo/apis/virtuozzo/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +const ( + bucketResName = "virtuozzo-bucket" +) + +// ProvisionVirtuozzobucket will create a bucket in Virtuozzo. +func ProvisionVirtuozzobucket(_ context.Context, bucket *appcatv1.ObjectBucket, svc *runtime.ServiceRuntime) *xfnproto.Result { + + err := svc.GetObservedComposite(bucket) + if err != nil { + return runtime.NewFatalResult(err) + } + + bucket.Status.BucketName = bucket.GetBucketName() + err = svc.SetDesiredCompositeStatus(bucket) + if err != nil { + return runtime.NewFatalResult(err) + } + + config, ok := svc.Config.Data["providerConfig"] + if !ok { + return runtime.NewFatalResult(fmt.Errorf("no providerConfig specified")) + } + + err = addBucket(svc, bucket, config) + if err != nil { + return runtime.NewFatalResult(err) + } + + svc.SetConnectionDetail("BUCKET_NAME", []byte(bucket.GetBucketName())) + svc.SetConnectionDetail("AWS_REGION", []byte(bucket.Spec.Parameters.Region)) + + err = populateEndpointConnectionDetails(svc) + if err != nil { + return runtime.NewFatalResult(err) + } + + cd, err := svc.GetObservedComposedResourceConnectionDetails(bucketResName) + if err != nil && err != runtime.ErrNotFound { + return runtime.NewFatalResult(err) + } + + for v, k := range cd { + svc.SetConnectionDetail(v, k) + } + + return nil +} + +func addBucket(svc *runtime.ServiceRuntime, bucket *appcatv1.ObjectBucket, config string) error { + + mb := &virtuozzov1.Bucket{ + ObjectMeta: metav1.ObjectMeta{ + Annotations: map[string]string{ + runtime.IgnoreConnectionDetailsAnnotation: "true", + }, + }, + Spec: virtuozzov1.BucketSpec{ + ForProvider: virtuozzov1.BucketParameters{ + BucketDeletionPolicy: virtuozzov1.BucketDeletionPolicy(bucket.Spec.Parameters.BucketDeletionPolicy), + BucketName: bucket.GetBucketName(), + }, + ResourceSpec: xpv1.ResourceSpec{ + ProviderConfigReference: &xpv1.Reference{ + Name: config, + }, + WriteConnectionSecretToReference: &xpv1.SecretReference{ + Namespace: svc.Config.Data["providerSecretNamespace"], + }, + }, + }, + } + + objName := util.GetBucketObjectName(svc, bucket, bucketResName, mb.DeepCopy()) + + mb.ObjectMeta.Name = objName + mb.Spec.WriteConnectionSecretToReference.Name = objName + + return svc.SetDesiredComposedResourceWithName(mb, bucketResName) +} + +func populateEndpointConnectionDetails(svc *runtime.ServiceRuntime) error { + + bucket := &virtuozzov1.Bucket{} + + err := svc.GetObservedComposedResource(bucket, bucketResName) + if err != nil && err == runtime.ErrNotFound { + return nil + } else if err != nil { + return err + } + + svc.SetConnectionDetail("ENDPOINT", []byte(bucket.Status.Endpoint)) + svc.SetConnectionDetail("ENDPOINT_URL", []byte(bucket.Status.EndpointURL)) + + return nil +} diff --git a/pkg/comp-functions/functions/buckets/virtuozzobucket/virtuozzobucket_test.go b/pkg/comp-functions/functions/buckets/virtuozzobucket/virtuozzobucket_test.go new file mode 100644 index 0000000000..9333d1ccaf --- /dev/null +++ b/pkg/comp-functions/functions/buckets/virtuozzobucket/virtuozzobucket_test.go @@ -0,0 +1,62 @@ +package virtuozzobucket + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" + v1 "github.com/vshn/appcat/v4/apis/v1" + "github.com/vshn/appcat/v4/pkg/comp-functions/functions/commontest" + virtuozzov1 "github.com/vshn/provider-virtuozzo/apis/virtuozzo/v1" +) + +func TestProvisionVirtuozzobucket(t *testing.T) { + svc := commontest.LoadRuntimeFromFile(t, "virtuozzobucket/bucket.yaml") + + ctx := context.TODO() + + bucketName := "mytest" + + res := ProvisionVirtuozzobucket(ctx, &v1.ObjectBucket{}, svc) + assert.Nil(t, res) + + bucket := &virtuozzov1.Bucket{} + assert.NoError(t, svc.GetDesiredComposedResourceByName(bucket, "virtuozzo-bucket")) + assert.Equal(t, bucketName, bucket.GetName()) +} + +// GivenObservedBucket_ThenExpectNameFromObserved +func TestExistingBuckets(t *testing.T) { + svc := commontest.LoadRuntimeFromFile(t, "virtuozzobucket/bucket-existing.yaml") + + ctx := context.TODO() + + res := ProvisionVirtuozzobucket(ctx, &v1.ObjectBucket{}, svc) + assert.Nil(t, res) + + bucket := &virtuozzov1.Bucket{} + assert.NoError(t, svc.GetDesiredComposedResourceByName(bucket, "virtuozzo-bucket")) + assert.Equal(t, "existing-bucket", bucket.GetName()) +} + +// TestBucketWithoutName tests that when bucketName is not specified, it uses the composite name +func TestBucketWithoutName(t *testing.T) { + svc := commontest.LoadRuntimeFromFile(t, "virtuozzobucket/bucket-no-name.yaml") + + ctx := context.TODO() + compositeName := "testbucket-abc789" + + compositeBucket := &v1.ObjectBucket{} + err := svc.GetObservedComposite(compositeBucket) + assert.NoError(t, err) + + res := ProvisionVirtuozzobucket(ctx, compositeBucket, svc) + assert.Nil(t, res) + + assert.Equal(t, compositeName, compositeBucket.Status.BucketName) + + bucket := &virtuozzov1.Bucket{} + assert.NoError(t, svc.GetDesiredComposedResourceByName(bucket, "virtuozzo-bucket")) + assert.Equal(t, compositeName, bucket.GetName()) + assert.Equal(t, compositeName, bucket.Spec.ForProvider.BucketName) +} diff --git a/pkg/scheme.go b/pkg/scheme.go index f2ef4fce1c..b7089abe59 100644 --- a/pkg/scheme.go +++ b/pkg/scheme.go @@ -30,6 +30,7 @@ import ( cloudscalev1 "github.com/vshn/provider-cloudscale/apis/cloudscale/v1" exoscalev1 "github.com/vshn/provider-exoscale/apis/exoscale/v1" + virtuozzov1 "github.com/vshn/provider-virtuozzo/apis/virtuozzo/v1" netv1 "k8s.io/api/networking/v1" pdbv1 "k8s.io/api/policy/v1" rbacv1 "k8s.io/api/rbac/v1" @@ -72,4 +73,5 @@ func AddToScheme(s *runtime.Scheme) { _ = spksv1alpha1.SchemeBuilder.AddToScheme(s) _ = my1alpha1.SchemeBuilder.AddToScheme(s) _ = codey.SchemeBuilder.AddToScheme(s) + _ = virtuozzov1.SchemeBuilder.AddToScheme(s) } diff --git a/test/functions/virtuozzobucket/bucket-existing.yaml b/test/functions/virtuozzobucket/bucket-existing.yaml new file mode 100644 index 0000000000..560f904bd6 --- /dev/null +++ b/test/functions/virtuozzobucket/bucket-existing.yaml @@ -0,0 +1,29 @@ +desired: {} +input: + apiVersion: v1 + data: + providerConfig: virtuozzo + kind: ConfigMap + metadata: + annotations: {} + labels: + name: xfn-config + name: xfn-config +observed: + composite: + resource: + apiVersion: appcat.vshn.io/v1 + kind: ObjectBucket + metadata: + name: testbucket + namespace: default + spec: + parameters: + bucketName: mytest + resources: + virtuozzo-bucket: + resource: + apiVersion: virtuozzo.crossplane.io/v1 + kind: Bucket + metadata: + name: existing-bucket diff --git a/test/functions/virtuozzobucket/bucket-no-name.yaml b/test/functions/virtuozzobucket/bucket-no-name.yaml new file mode 100644 index 0000000000..6c11c2975a --- /dev/null +++ b/test/functions/virtuozzobucket/bucket-no-name.yaml @@ -0,0 +1,22 @@ +desired: {} +input: + apiVersion: v1 + data: + providerConfig: virtuozzo + kind: ConfigMap + metadata: + annotations: {} + labels: + name: xfn-config + name: xfn-config +observed: + composite: + resource: + apiVersion: appcat.vshn.io/v1 + kind: ObjectBucket + metadata: + name: testbucket-abc789 + namespace: default + spec: + parameters: + region: lpg diff --git a/test/functions/virtuozzobucket/bucket.yaml b/test/functions/virtuozzobucket/bucket.yaml new file mode 100644 index 0000000000..6e3eccb323 --- /dev/null +++ b/test/functions/virtuozzobucket/bucket.yaml @@ -0,0 +1,22 @@ +desired: {} +input: + apiVersion: v1 + data: + providerConfig: virtuozzo + kind: ConfigMap + metadata: + annotations: {} + labels: + name: xfn-config + name: xfn-config +observed: + composite: + resource: + apiVersion: appcat.vshn.io/v1 + kind: ObjectBucket + metadata: + name: testbucket + namespace: default + spec: + parameters: + bucketName: mytest