From 8e55bdc886964a3237a75923fd8247e92f3c6974 Mon Sep 17 00:00:00 2001 From: Felix Breuer Date: Wed, 14 Jan 2026 13:41:47 +0100 Subject: [PATCH 1/7] reconcile allowedaddresses in nic Signed-off-by: Felix Breuer --- go.mod | 65 +++++----- go.sum | 143 ++++++++++----------- pkg/provider/apis/provider_spec.go | 4 + pkg/provider/apis/validation/validation.go | 10 ++ pkg/provider/core.go | 52 +++++++- pkg/provider/core_mocks_test.go | 18 +++ pkg/provider/sdk_client.go | 60 +++++++++ pkg/provider/stackit_client.go | 11 ++ 8 files changed, 251 insertions(+), 112 deletions(-) diff --git a/go.mod b/go.mod index a1698d13..53952c94 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/stackitcloud/machine-controller-manager-provider-stackit -go 1.24.0 +go 1.24.5 require ( github.com/gardener/machine-controller-manager v0.60.2 @@ -21,12 +21,13 @@ require ( github.com/blang/semver/v4 v4.0.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/emicklei/go-restful/v3 v3.12.2 // indirect + github.com/emicklei/go-restful/v3 v3.13.0 // indirect github.com/fxamacker/cbor/v2 v2.9.0 // indirect github.com/go-logr/logr v1.4.3 // indirect - github.com/go-openapi/jsonpointer v0.21.0 // indirect - github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/swag v0.23.0 // indirect + github.com/go-openapi/jsonpointer v0.22.1 // indirect + github.com/go-openapi/jsonreference v0.21.2 // indirect + github.com/go-openapi/swag v0.23.1 // indirect + github.com/go-openapi/swag/jsonname v0.25.1 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v5 v5.3.0 // indirect @@ -36,42 +37,42 @@ require ( github.com/google/uuid v1.6.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/josharian/intern v1.0.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect - github.com/mailru/easyjson v0.7.7 // indirect + github.com/json-iterator/go v1.1.13-0.20220915233716-71ac16282d12 // indirect + github.com/klauspost/compress v1.18.1 // indirect + github.com/mailru/easyjson v0.9.0 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.22.0 // indirect - github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.62.0 // indirect - github.com/prometheus/procfs v0.15.1 // indirect - github.com/spf13/cobra v1.9.1 // indirect + github.com/prometheus/client_golang v1.23.2 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.67.4 // indirect + github.com/prometheus/procfs v0.17.0 // indirect + github.com/spf13/cobra v1.10.2 // indirect github.com/x448/float16 v0.8.4 // indirect - go.opentelemetry.io/otel v1.35.0 // indirect - go.opentelemetry.io/otel/trace v1.35.0 // indirect - go.yaml.in/yaml/v2 v2.4.2 // indirect + go.opentelemetry.io/otel v1.38.0 // indirect + go.opentelemetry.io/otel/trace v1.38.0 // indirect + go.yaml.in/yaml/v2 v2.4.3 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/mod v0.27.0 // indirect - golang.org/x/net v0.43.0 // indirect - golang.org/x/oauth2 v0.27.0 // indirect - golang.org/x/sync v0.16.0 // indirect - golang.org/x/sys v0.35.0 // indirect - golang.org/x/term v0.34.0 // indirect - golang.org/x/text v0.28.0 // indirect - golang.org/x/time v0.9.0 // indirect - golang.org/x/tools v0.36.0 // indirect - google.golang.org/protobuf v1.36.7 // indirect - gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect + golang.org/x/mod v0.31.0 // indirect + golang.org/x/net v0.48.0 // indirect + golang.org/x/oauth2 v0.32.0 // indirect + golang.org/x/sync v0.19.0 // indirect + golang.org/x/sys v0.39.0 // indirect + golang.org/x/term v0.38.0 // indirect + golang.org/x/text v0.32.0 // indirect + golang.org/x/time v0.14.0 // indirect + golang.org/x/tools v0.40.0 // indirect + google.golang.org/protobuf v1.36.10 // indirect + gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiserver v0.31.0 // indirect + k8s.io/apiserver v0.34.3 // indirect k8s.io/client-go v0.34.3 // indirect - k8s.io/cluster-bootstrap v0.31.0 // indirect - k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b // indirect - k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 // indirect - sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect + k8s.io/cluster-bootstrap v0.34.3 // indirect + k8s.io/kube-openapi v0.0.0-20250814151709-d7b6acb124c3 // indirect + k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 // indirect + sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect sigs.k8s.io/randfill v1.0.0 // indirect sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect sigs.k8s.io/yaml v1.6.0 // indirect diff --git a/go.sum b/go.sum index 0b14b3d1..eef9c64f 100644 --- a/go.sum +++ b/go.sum @@ -7,13 +7,12 @@ github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2y github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU= -github.com/emicklei/go-restful/v3 v3.12.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.13.0 h1:C4Bl2xDndpU6nJ4bc1jXd+uTmYPVUwkD6bFY/oTyCes= +github.com/emicklei/go-restful/v3 v3.13.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/gardener/machine-controller-manager v0.60.2 h1:lY6z67lDlwl9dQUEmlJbrmpxWK10o/rVRUu4JB7xK4U= @@ -28,14 +27,14 @@ github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= -github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= -github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= -github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= -github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= -github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= -github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-openapi/jsonpointer v0.22.1 h1:sHYI1He3b9NqJ4wXLoJDKmUmHkWy/L7rtEo92JUxBNk= +github.com/go-openapi/jsonpointer v0.22.1/go.mod h1:pQT9OsLkfz1yWoMgYFy4x3U5GY5nUlsOn1qSBH5MkCM= +github.com/go-openapi/jsonreference v0.21.2 h1:Wxjda4M/BBQllegefXrY/9aq1fxBA8sI5M/lFU6tSWU= +github.com/go-openapi/jsonreference v0.21.2/go.mod h1:pp3PEjIsJ9CZDGCNOyXIQxsNuroxm8FAJ/+quA0yKzQ= +github.com/go-openapi/swag v0.23.1 h1:lpsStH0n2ittzTnbaSloVZLuB5+fvSY/+hnagBjSNZU= +github.com/go-openapi/swag v0.23.1/go.mod h1:STZs8TbRvEQQKUA+JZNAm3EWlgaOBGpyFDqQnDHMef0= +github.com/go-openapi/swag/jsonname v0.25.1 h1:Sgx+qbwa4ej6AomWC6pEfXrA6uP2RkaNjA9BR8a1RJU= +github.com/go-openapi/swag/jsonname v0.25.1/go.mod h1:71Tekow6UOLBD3wS7XhdT98g5J5GR13NOTQ9/6Q11Zo= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= @@ -59,23 +58,20 @@ github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8Hm github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/joshdk/go-junit v1.0.0 h1:S86cUKIdwBHWwA6xCmFlf3RTLfVXYQfvanM5Uh+K6GE= github.com/joshdk/go-junit v1.0.0/go.mod h1:TiiV0PqkaNfFXjEiyjWM3XXrhVyCa1K4Zfga6W52ung= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/json-iterator/go v1.1.13-0.20220915233716-71ac16282d12 h1:9Nu54bhS/H/Kgo2/7xNSUuC5G28VR8ljfrLKU2G4IjU= +github.com/json-iterator/go v1.1.13-0.20220915233716-71ac16282d12/go.mod h1:TBzl5BIHNXfS9+C35ZyJaklL7mLDbgUkcgXzSLa8Tk0= 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.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= -github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/klauspost/compress v1.18.1 h1:bcSGx7UbpBqMChDtsF28Lw6v/G94LPrrbMbdC3JH2co= +github.com/klauspost/compress v1.18.1/go.mod h1:ZQFFVG+MdnR0P+l6wpXgIL4NTtwiKIdBnrBd8Nrxr+0= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= +github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= github.com/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo= github.com/maruel/natural v1.1.1/go.mod h1:v+Rfd79xlw1AgVBjbO0BEQmptqb5HvL/k9GRHB7ZKEg= github.com/mfridman/tparse v0.18.0 h1:wh6dzOKaIwkUGyKgOntDW4liXSo37qg5AXbIhkMV3vE= @@ -92,25 +88,23 @@ github.com/onsi/ginkgo/v2 v2.27.5 h1:ZeVgZMx2PDMdJm/+w5fE/OyG6ILo1Y3e+QX4zSR0zTE github.com/onsi/ginkgo/v2 v2.27.5/go.mod h1:ArE1D/XhNXBXCBkKOLkbsb2c81dQHCRcF5zwn/ykDRo= github.com/onsi/gomega v1.39.0 h1:y2ROC3hKFmQZJNFeGAMeHZKkjBL65mIZcvrLQBF9k6Q= github.com/onsi/gomega v1.39.0/go.mod h1:ZCU1pkQcXDO5Sl9/VVEGlDyp+zm0m1cmeG5TOzLgdh4= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= -github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= -github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= -github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= -github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= +github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.67.4 h1:yR3NqWO1/UyO1w2PhUvXlGQs/PtFmoveVO0KZ4+Lvsc= +github.com/prometheus/common v0.67.4/go.mod h1:gP0fq6YjjNCLssJCQp0yk4M8W6ikLURwkdd/YKtTbyI= +github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0= +github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= -github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= -github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= +github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= +github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stackitcloud/stackit-sdk-go/core v0.20.1 h1:odiuhhRXmxvEvnVTeZSN9u98edvw2Cd3DcnkepncP3M= @@ -119,15 +113,12 @@ github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.0 h1:U/x0tc487X9msMS5y github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.0/go.mod h1:6+5+RCDfU7eQN3+/SGdOtx7Bq9dEa2FrHz/jflgY1M4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= @@ -140,18 +131,18 @@ 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/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= -go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= -go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= -go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= +go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= +go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= +go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= +go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= -go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= +go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= +go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -159,51 +150,51 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ= -golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc= +golang.org/x/mod v0.31.0 h1:HaW9xtz0+kOcWKwli0ZXy79Ix+UW/vOfmWI5QVd2tgI= +golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= -golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= -golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M= -golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= +golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU= +golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY= +golang.org/x/oauth2 v0.32.0 h1:jsCblLleRMDrxMN29H3z/k1KliIvpLgCkE6R8FXXNgY= +golang.org/x/oauth2 v0.32.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= -golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= -golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4= -golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw= +golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= +golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.38.0 h1:PQ5pkm/rLO6HnxFR7N2lJHOZX6Kez5Y1gDSJla6jo7Q= +golang.org/x/term v0.38.0/go.mod h1:bSEAKrOT1W+VSu9TSCMtoGEOUcKxOKgl3LE5QEF/xVg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= -golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= -golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY= -golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= +golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= +golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= +golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg= -golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s= +golang.org/x/tools v0.40.0 h1:yLkxfA+Qnul4cs9QA3KnlFu0lVmd8JJfoq+E41uSutA= +golang.org/x/tools v0.40.0/go.mod h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= -google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= +google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= +google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= -gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= +gopkg.in/evanphx/json-patch.v4 v4.13.0 h1:czT3CmqEaQ1aanPc5SdlgQrrEIb8w/wwCvWWnfEbYzo= +gopkg.in/evanphx/json-patch.v4 v4.13.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -213,22 +204,22 @@ k8s.io/api v0.34.3 h1:D12sTP257/jSH2vHV2EDYrb16bS7ULlHpdNdNhEw2S4= k8s.io/api v0.34.3/go.mod h1:PyVQBF886Q5RSQZOim7DybQjAbVs8g7gwJNhGtY5MBk= k8s.io/apimachinery v0.34.3 h1:/TB+SFEiQvN9HPldtlWOTp0hWbJ+fjU+wkxysf/aQnE= k8s.io/apimachinery v0.34.3/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw= -k8s.io/apiserver v0.31.0 h1:p+2dgJjy+bk+B1Csz+mc2wl5gHwvNkC9QJV+w55LVrY= -k8s.io/apiserver v0.31.0/go.mod h1:KI9ox5Yu902iBnnyMmy7ajonhKnkeZYJhTZ/YI+WEMk= +k8s.io/apiserver v0.34.3 h1:uGH1qpDvSiYG4HVFqc6A3L4CKiX+aBWDrrsxHYK0Bdo= +k8s.io/apiserver v0.34.3/go.mod h1:QPnnahMO5C2m3lm6fPW3+JmyQbvHZQ8uudAu/493P2w= k8s.io/client-go v0.34.3 h1:wtYtpzy/OPNYf7WyNBTj3iUA0XaBHVqhv4Iv3tbrF5A= k8s.io/client-go v0.34.3/go.mod h1:OxxeYagaP9Kdf78UrKLa3YZixMCfP6bgPwPwNBQBzpM= -k8s.io/cluster-bootstrap v0.31.0 h1:jj5t1PArBPddvDypdNpzqnZQ/+qnGxpJuTF7SX05h1Y= -k8s.io/cluster-bootstrap v0.31.0/go.mod h1:6ujqWFrBV4amKe1ii/6BXgrd57bF/Q3gXebLJdmfSK4= +k8s.io/cluster-bootstrap v0.34.3 h1:mLguWldCwTk0GvoWHg6tf6qgpVMDLCSvvtWUoL13RXg= +k8s.io/cluster-bootstrap v0.34.3/go.mod h1:50AJCDVJ8HMmw9W2EN0cHSbTsI9GYtyOM+eyxjVlAwg= k8s.io/component-base v0.34.3 h1:zsEgw6ELqK0XncCQomgO9DpUIzlrYuZYA0Cgo+JWpVk= k8s.io/component-base v0.34.3/go.mod h1:5iIlD8wPfWE/xSHTRfbjuvUul2WZbI2nOUK65XL0E/c= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b h1:MloQ9/bdJyIu9lb1PzujOPolHyvO06MXG5TUIj2mNAA= -k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b/go.mod h1:UZ2yyWbFTpuhSbFhv24aGNOdoRdJZgsIObGBUaYVsts= -k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8tmbZBHi4zVsl1Y= -k8s.io/utils v0.0.0-20250604170112-4c0f3b243397/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE= -sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= +k8s.io/kube-openapi v0.0.0-20250814151709-d7b6acb124c3 h1:liMHz39T5dJO1aOKHLvwaCjDbf07wVh6yaUlTpunnkE= +k8s.io/kube-openapi v0.0.0-20250814151709-d7b6acb124c3/go.mod h1:UZ2yyWbFTpuhSbFhv24aGNOdoRdJZgsIObGBUaYVsts= +k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 h1:SjGebBtkBqHFOli+05xYbK8YF1Dzkbzn+gDM4X9T4Ck= +k8s.io/utils v0.0.0-20251002143259-bc988d571ff4/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco= diff --git a/pkg/provider/apis/provider_spec.go b/pkg/provider/apis/provider_spec.go index f8b91ba8..cb1822d4 100644 --- a/pkg/provider/apis/provider_spec.go +++ b/pkg/provider/apis/provider_spec.go @@ -28,6 +28,10 @@ type ProviderSpec struct { // Optional field. If not specified, the server may use default networking or require manual configuration. Networking *NetworkingSpec `json:"networking,omitempty"` + // AllowedAddresses are the IP address ranges (CIDRs) allowed to originate traffic from the server's network interface. + // Optional field. If specified, these ranges are configured as AllowedAddresses on the network interface of the server to bypass anti-spoofing rules. + AllowedAddresses []string `json:"allowedAddresses,omitempty"` + // SecurityGroups are the names of security groups to attach to the server // Optional field. If not specified, the project's default security group will be used. SecurityGroups []string `json:"securityGroups,omitempty"` diff --git a/pkg/provider/apis/validation/validation.go b/pkg/provider/apis/validation/validation.go index c27bac58..bc7a7f55 100644 --- a/pkg/provider/apis/validation/validation.go +++ b/pkg/provider/apis/validation/validation.go @@ -8,6 +8,7 @@ package validation import ( "encoding/json" "fmt" + "net" "regexp" api "github.com/stackitcloud/machine-controller-manager-provider-stackit/pkg/provider/apis" @@ -165,6 +166,15 @@ func ValidateProviderSpecNSecret(spec *api.ProviderSpec, secrets *corev1.Secret) } } + // Validate AllowedAddresses + if len(spec.AllowedAddresses) > 0 { + for _, cidr := range spec.AllowedAddresses { + if _, _, err := net.ParseCIDR(cidr); err != nil { + errors = append(errors, fmt.Errorf("providerSpec.allowedAddresses has an invalid CIDR: %s", cidr)) + } + } + } + // Validate AffinityGroup if spec.AffinityGroup != "" { if !isValidUUID(spec.AffinityGroup) { diff --git a/pkg/provider/core.go b/pkg/provider/core.go index f36e799d..d218725e 100644 --- a/pkg/provider/core.go +++ b/pkg/provider/core.go @@ -10,10 +10,12 @@ import ( "encoding/base64" "errors" "fmt" + "slices" "github.com/gardener/machine-controller-manager/pkg/util/provider/driver" "github.com/gardener/machine-controller-manager/pkg/util/provider/machinecodes/codes" "github.com/gardener/machine-controller-manager/pkg/util/provider/machinecodes/status" + api "github.com/stackitcloud/machine-controller-manager-provider-stackit/pkg/provider/apis" "github.com/stackitcloud/machine-controller-manager-provider-stackit/pkg/provider/apis/validation" "k8s.io/klog/v2" ) @@ -189,20 +191,62 @@ func (p *Provider) CreateMachine(ctx context.Context, req *driver.CreateMachineR return nil, status.Error(codes.Internal, fmt.Sprintf("failed to create server: %v", err)) } + if err := p.patchNetworkInterface(ctx, projectID, server.ID, providerSpec); err != nil { + klog.Errorf("Failed to patch network interface for server %q: %v", req.Machine.Name, err) + return nil, status.Error(codes.Internal, fmt.Sprintf("failed to patch network interface for server: %v", err)) + } + // Generate ProviderID in format: stackit:/// providerID := fmt.Sprintf("%s://%s/%s", StackitProviderName, projectID, server.ID) - // NodeName is the machine name (will register with this name in Kubernetes) - nodeName := req.Machine.Name - klog.V(2).Infof("Successfully created server %q with ID %q for machine %q", server.Name, server.ID, req.Machine.Name) return &driver.CreateMachineResponse{ ProviderID: providerID, - NodeName: nodeName, + NodeName: req.Machine.Name, }, nil } +func (p *Provider) patchNetworkInterface(ctx context.Context, projectID, serverID string, providerSpec *api.ProviderSpec) error { + if providerSpec.Networking == nil { + // TODO: should we also patch nics from the default network? + return nil + // return fmt.Errorf("failed to path allowedAddresses, providerspec.networking is nil") + } + + nics, err := p.client.GetNICsForServer(ctx, projectID, providerSpec.Region, serverID) + if err != nil { + return fmt.Errorf("failed to get NICs for server %q: %w", serverID, err) + } + + for _, nic := range nics { + if providerSpec.Networking.NetworkID != nic.NetworkID && !slices.Contains(providerSpec.Networking.NICIDs, nic.ID) { + continue + } + + updateNic := false + // check if every cidr in providerspec.allowedAddresses is inside the nic allowedAddresses + for _, allowedAddress := range providerSpec.AllowedAddresses { + if !slices.Contains(nic.AllowedAddresses, allowedAddress) { + nic.AllowedAddresses = append(nic.AllowedAddresses, allowedAddress) + updateNic = true + } + } + + if !updateNic { + continue + } + + if _, err := p.client.UpdateNIC(ctx, projectID, providerSpec.Region, nic.NetworkID, nic.ID, nic.AllowedAddresses); err != nil { + return fmt.Errorf("failed to update allowed addresses for NIC %s: %w", nic.ID, err) + } + + klog.V(2).Infof("Updated allowed addresses for NIC %s to %v", nic.ID, nic.AllowedAddresses) + } + + return nil +} + // DeleteMachine handles a machine deletion request by deleting the STACKIT server // // This method deletes the server identified by the ProviderID from STACKIT infrastructure. diff --git a/pkg/provider/core_mocks_test.go b/pkg/provider/core_mocks_test.go index 0de56d0e..5f3ef8e9 100644 --- a/pkg/provider/core_mocks_test.go +++ b/pkg/provider/core_mocks_test.go @@ -17,6 +17,8 @@ type mockStackitClient struct { getServerFunc func(ctx context.Context, projectID, region, serverID string) (*Server, error) deleteServerFunc func(ctx context.Context, projectID, region, serverID string) error listServersFunc func(ctx context.Context, projectID, region, labelSelector string) ([]*Server, error) + getNICsFunc func(ctx context.Context, projectID, region, serverID string) ([]*NIC, error) + updateNICFunc func(ctx context.Context, projectID, region, networkID, nicID string, allowedAddresses []string) (*NIC, error) } func (m *mockStackitClient) CreateServer(ctx context.Context, projectID, region string, req *CreateServerRequest) (*Server, error) { @@ -55,6 +57,22 @@ func (m *mockStackitClient) ListServers(ctx context.Context, projectID, region, return []*Server{}, nil } +func (m *mockStackitClient) GetNICsForServer(ctx context.Context, projectID, region, serverID string) ([]*NIC, error) { + if m.getNICsFunc != nil { + return m.getNICsFunc(ctx, projectID, region, serverID) + } + return []*NIC{}, nil +} + +func (m *mockStackitClient) UpdateNIC(ctx context.Context, projectID, region, networkID, nicID string, allowedAddresses []string) (*NIC, error) { + if m.listServersFunc != nil { + return m.updateNICFunc(ctx, projectID, region, networkID, nicID, allowedAddresses) + } + return &NIC{}, nil +} + +// UpdateNIC updates a network interface + // encodeProviderSpec is a helper function to encode ProviderSpec for tests func encodeProviderSpec(spec *api.ProviderSpec) ([]byte, error) { return encodeProviderSpecForResponse(spec) diff --git a/pkg/provider/sdk_client.go b/pkg/provider/sdk_client.go index 72079648..c8a3dfab 100644 --- a/pkg/provider/sdk_client.go +++ b/pkg/provider/sdk_client.go @@ -304,8 +304,68 @@ func (c *SdkStackitClient) ListServers(ctx context.Context, projectID, region, l return servers, nil } +func (c *SdkStackitClient) GetNICsForServer(ctx context.Context, projectID, region, serverID string) ([]*NIC, error) { + res, err := c.iaasClient.ListServerNICs(ctx, projectID, region, serverID).Execute() + if err != nil { + return nil, fmt.Errorf("SDK ListServerNICs failed: %w", err) + } + + if res.Items == nil { + return []*NIC{}, nil + } + + nics := make([]*NIC, 0) + for _, nic := range *res.Items { + nics = append(nics, convertSDKNICtoNIC(nic)) + } + + return nics, nil +} + +func (c *SdkStackitClient) UpdateNIC(ctx context.Context, projectID, region, networkID, nicID string, allowedAddresses []string) (*NIC, error) { + addresses := make([]iaas.AllowedAddressesInner, 0) + + for _, addr := range allowedAddresses { + addresses = append(addresses, iaas.AllowedAddressesInner{ + String: ptr(addr), + }) + } + + payload := iaas.UpdateNicPayload{ + AllowedAddresses: &addresses, + } + + sdkNic, err := c.iaasClient.UpdateNic(ctx, projectID, region, networkID, nicID).UpdateNicPayload(payload).Execute() + if err != nil { + return nil, fmt.Errorf("SDK UpdateNic failed: %w", err) + } + + if sdkNic == nil { + return nil, nil + } + + return convertSDKNICtoNIC(*sdkNic), nil +} + // Helper functions +func convertSDKNICtoNIC(nic iaas.NIC) *NIC { + addresses := make([]string, 0) + if nic.AllowedAddresses != nil { + for _, addr := range *nic.AllowedAddresses { + if addr.String != nil { + addresses = append(addresses, *addr.String) + } + } + } + + return &NIC{ + ID: getStringValue(nic.Id), + NetworkID: getStringValue(nic.NetworkId), + AllowedAddresses: addresses, + } +} + // getStringValue safely dereferences a string pointer, returning empty string if nil func getStringValue(s *string) string { if s == nil { diff --git a/pkg/provider/stackit_client.go b/pkg/provider/stackit_client.go index 442ebb3c..c9d4d8ef 100644 --- a/pkg/provider/stackit_client.go +++ b/pkg/provider/stackit_client.go @@ -27,6 +27,10 @@ type StackitClient interface { DeleteServer(ctx context.Context, projectID, region, serverID string) error // ListServers lists all servers in a project ListServers(ctx context.Context, projectID, region, labelSelector string) ([]*Server, error) + // GetNICsForServer retrieves a network interfaces for a given server + GetNICsForServer(ctx context.Context, projectID, region, serverID string) ([]*NIC, error) + // UpdateNIC updates a network interface + UpdateNIC(ctx context.Context, projectID, region, networkID, nicID string, allowedAddresses []string) (*NIC, error) } // CreateServerRequest represents the request to create a server @@ -86,3 +90,10 @@ type Server struct { Status string `json:"status"` Labels map[string]string `json:"labels,omitempty"` } + +// NIC represents a STACKIT network interface +type NIC struct { + ID string + NetworkID string + AllowedAddresses []string +} From 67136bdafe46b9f16aa5b1842ccc876686ee867d Mon Sep 17 00:00:00 2001 From: Felix Breuer Date: Thu, 15 Jan 2026 15:34:40 +0100 Subject: [PATCH 2/7] wait fo server to become ready Signed-off-by: Felix Breuer --- pkg/provider/core.go | 44 +++++++++++++++++++- pkg/provider/core_get_machine_status_test.go | 4 +- pkg/provider/core_mocks_test.go | 2 +- 3 files changed, 45 insertions(+), 5 deletions(-) diff --git a/pkg/provider/core.go b/pkg/provider/core.go index d218725e..b463ec7b 100644 --- a/pkg/provider/core.go +++ b/pkg/provider/core.go @@ -11,12 +11,14 @@ import ( "errors" "fmt" "slices" + "time" "github.com/gardener/machine-controller-manager/pkg/util/provider/driver" "github.com/gardener/machine-controller-manager/pkg/util/provider/machinecodes/codes" "github.com/gardener/machine-controller-manager/pkg/util/provider/machinecodes/status" api "github.com/stackitcloud/machine-controller-manager-provider-stackit/pkg/provider/apis" "github.com/stackitcloud/machine-controller-manager-provider-stackit/pkg/provider/apis/validation" + "k8s.io/apimachinery/pkg/util/wait" "k8s.io/klog/v2" ) @@ -191,14 +193,19 @@ func (p *Provider) CreateMachine(ctx context.Context, req *driver.CreateMachineR return nil, status.Error(codes.Internal, fmt.Sprintf("failed to create server: %v", err)) } - if err := p.patchNetworkInterface(ctx, projectID, server.ID, providerSpec); err != nil { + activeServer, err := p.waitForServerStatus(ctx, projectID, providerSpec.Region, server.ID) + if err != nil { + klog.Errorf("Server failed to become active for machine: %q: %v", req.Machine.Name, err) + return nil, status.Error(codes.Internal, fmt.Sprintf("server failed to become active: %v", err)) + } + + if err := p.patchNetworkInterface(ctx, projectID, activeServer.ID, providerSpec); err != nil { klog.Errorf("Failed to patch network interface for server %q: %v", req.Machine.Name, err) return nil, status.Error(codes.Internal, fmt.Sprintf("failed to patch network interface for server: %v", err)) } // Generate ProviderID in format: stackit:/// providerID := fmt.Sprintf("%s://%s/%s", StackitProviderName, projectID, server.ID) - klog.V(2).Infof("Successfully created server %q with ID %q for machine %q", server.Name, server.ID, req.Machine.Name) return &driver.CreateMachineResponse{ @@ -207,6 +214,39 @@ func (p *Provider) CreateMachine(ctx context.Context, req *driver.CreateMachineR }, nil } +func (p *Provider) waitForServerStatus(ctx context.Context, projectID, region, serverID string) (*Server, error) { + var server *Server + return server, wait.PollUntilContextTimeout( + ctx, + 10*time.Second, + time.Duration(120)*time.Second, + true, + func(_ context.Context) (done bool, err error) { + current, err := p.client.GetServer(ctx, projectID, region, serverID) + if err != nil { + return false, err + } + + klog.V(5).Infof("waiting for server [ID=%q] and current status %v, to reach status ACTIVE.", serverID, current.Status) + if current.Status == "ACTIVE" { + server = current + return true, nil + } + + if current.Status == "CREATING" || current.Status == "STARTING" { + return false, nil + } + + // TODO: maybe check for other status conditions here + retErr := fmt.Errorf("server [ID=%q] reached unexpected status %q", serverID, current.Status) + // if current.Status == "ERROR" { + // retErr = fmt.Errorf("%s, fault: %+v", retErr, current.Fault) + // } + + return false, retErr + }) +} + func (p *Provider) patchNetworkInterface(ctx context.Context, projectID, serverID string, providerSpec *api.ProviderSpec) error { if providerSpec.Networking == nil { // TODO: should we also patch nics from the default network? diff --git a/pkg/provider/core_get_machine_status_test.go b/pkg/provider/core_get_machine_status_test.go index c70a46a0..4470d700 100644 --- a/pkg/provider/core_get_machine_status_test.go +++ b/pkg/provider/core_get_machine_status_test.go @@ -90,7 +90,7 @@ var _ = Describe("GetMachineStatus", func() { return &Server{ ID: serverID, Name: "test-machine", - Status: "RUNNING", + Status: "ACTIVE", }, nil } @@ -112,7 +112,7 @@ var _ = Describe("GetMachineStatus", func() { return &Server{ ID: serverID, Name: "test-machine", - Status: "RUNNING", + Status: "ACTIVE", }, nil } diff --git a/pkg/provider/core_mocks_test.go b/pkg/provider/core_mocks_test.go index 5f3ef8e9..fb4fd033 100644 --- a/pkg/provider/core_mocks_test.go +++ b/pkg/provider/core_mocks_test.go @@ -39,7 +39,7 @@ func (m *mockStackitClient) GetServer(ctx context.Context, projectID, region, se return &Server{ ID: serverID, Name: "test-machine", - Status: "RUNNING", + Status: "ACTIVE", }, nil } From 2105a7e7aec3f3834e0a7c4bb2ee579f29a49361 Mon Sep 17 00:00:00 2001 From: Felix Breuer Date: Fri, 16 Jan 2026 14:02:04 +0100 Subject: [PATCH 3/7] delete machines without providerID Signed-off-by: Felix Breuer --- pkg/provider/core.go | 88 ++++++++++++++----- .../core_create_machine_basic_test.go | 2 +- pkg/provider/core_delete_machine_test.go | 2 +- pkg/provider/sdk_client.go | 15 ---- 4 files changed, 68 insertions(+), 39 deletions(-) diff --git a/pkg/provider/core.go b/pkg/provider/core.go index b463ec7b..7f9f7c37 100644 --- a/pkg/provider/core.go +++ b/pkg/provider/core.go @@ -186,22 +186,31 @@ func (p *Provider) CreateMachine(ctx context.Context, req *driver.CreateMachineR createReq.Metadata = providerSpec.Metadata } - // Call STACKIT API to create server - server, err := p.client.CreateServer(ctx, projectID, providerSpec.Region, createReq) + // check if server already exists + server, err := p.getServerByName(ctx, projectID, providerSpec.Region, req.Machine.Name) if err != nil { - klog.Errorf("Failed to create server for machine %q: %v", req.Machine.Name, err) - return nil, status.Error(codes.Internal, fmt.Sprintf("failed to create server: %v", err)) + klog.Errorf("Failed to fetch server for machine %q: %v", req.Machine.Name, err) + return nil, status.Error(codes.Unavailable, fmt.Sprintf("failed to fetch server: %v", err)) } - activeServer, err := p.waitForServerStatus(ctx, projectID, providerSpec.Region, server.ID) - if err != nil { - klog.Errorf("Server failed to become active for machine: %q: %v", req.Machine.Name, err) - return nil, status.Error(codes.Internal, fmt.Sprintf("server failed to become active: %v", err)) + if server == nil { + // Call STACKIT API to create server + server, err = p.client.CreateServer(ctx, projectID, providerSpec.Region, createReq) + if err != nil { + klog.Errorf("Failed to create server for machine %q: %v", req.Machine.Name, err) + return nil, status.Error(codes.Unavailable, fmt.Sprintf("failed to create server: %v", err)) + } } - if err := p.patchNetworkInterface(ctx, projectID, activeServer.ID, providerSpec); err != nil { + //activeServer, err := p.waitForServerStatus(ctx, projectID, providerSpec.Region, server.ID) + //if err != nil { + //klog.Errorf("Server failed to become active for machine: %q: %v", req.Machine.Name, err) + //return nil, status.Error(codes.Unavailable, fmt.Sprintf("server failed to become active: %v", err)) + //} + + if err := p.patchNetworkInterface(ctx, projectID, server.ID, providerSpec); err != nil { klog.Errorf("Failed to patch network interface for server %q: %v", req.Machine.Name, err) - return nil, status.Error(codes.Internal, fmt.Sprintf("failed to patch network interface for server: %v", err)) + return nil, status.Error(codes.Unavailable, fmt.Sprintf("failed to patch network interface for server: %v", err)) } // Generate ProviderID in format: stackit:/// @@ -214,6 +223,26 @@ func (p *Provider) CreateMachine(ctx context.Context, req *driver.CreateMachineR }, nil } +func (p *Provider) getServerByName(ctx context.Context, projectID, region, serverName string) (*Server, error) { + // Check if the server got already created + labelSelector := fmt.Sprintf("mcm.gardener.cloud/machine=%s", serverName) + servers, err := p.client.ListServers(ctx, projectID, region, labelSelector) + if err != nil { + return nil, fmt.Errorf("SDK ListServers with labelSelector: %v failed: %w", labelSelector, err) + } + + if len(servers) > 1 { + return nil, fmt.Errorf("%v servers found for server name %v", len(servers), serverName) + } + + if len(servers) == 1 { + return servers[0], nil + } + + // no servers found len == 0 + return nil, nil +} + func (p *Provider) waitForServerStatus(ctx context.Context, projectID, region, serverID string) (*Server, error) { var server *Server return server, wait.PollUntilContextTimeout( @@ -255,7 +284,7 @@ func (p *Provider) patchNetworkInterface(ctx context.Context, projectID, serverI } nics, err := p.client.GetNICsForServer(ctx, projectID, providerSpec.Region, serverID) - if err != nil { + if err != nil || len(nics) == 0 { return fmt.Errorf("failed to get NICs for server %q: %w", serverID, err) } @@ -300,33 +329,48 @@ func (p *Provider) DeleteMachine(ctx context.Context, req *driver.DeleteMachineR klog.V(2).Infof("Machine deletion request has been received for %q", req.Machine.Name) defer klog.V(2).Infof("Machine deletion request has been processed for %q", req.Machine.Name) - // Validate ProviderID exists - if req.Machine.Spec.ProviderID == "" { - return nil, status.Error(codes.InvalidArgument, "ProviderID is required") - } - // Extract credentials from Secret serviceAccountKey := string(req.Secret.Data["serviceaccount.json"]) - // Initialize client on first use (lazy initialization) if err := p.ensureClient(serviceAccountKey); err != nil { return nil, status.Error(codes.Internal, fmt.Sprintf("failed to initialize STACKIT client: %v", err)) } - // Parse ProviderID to extract projectID and serverID - projectID, serverID, err := parseProviderID(req.Machine.Spec.ProviderID) + var projectID, serverID string + var err error + if req.Machine.Spec.ProviderID != "" { + // Parse ProviderID to extract projectID and serverID + projectID, serverID, err = parseProviderID(req.Machine.Spec.ProviderID) + if err != nil { + klog.V(2).Infof("invalid ProviderID format: %v", err) + } + } + if projectID == "" { projectID = string(req.Secret.Data["project-id"]) } - if err != nil { - return nil, status.Error(codes.InvalidArgument, fmt.Sprintf("invalid ProviderID format: %v", err)) - } providerSpec, err := decodeProviderSpec(req.MachineClass) if err != nil { return nil, status.Error(codes.Internal, err.Error()) } + if serverID == "" { + server, err := p.getServerByName(ctx, projectID, providerSpec.Region, req.Machine.Name) + if err != nil { + return nil, status.Error(codes.Internal, fmt.Sprintf("failed to find server by name: %v", err)) + } + + if server != nil { + serverID = server.ID + } + } + + if serverID == "" { + klog.V(2).Infof("Server is already deleted for machine %q", req.Machine.Name) + return &driver.DeleteMachineResponse{}, nil + } + // Call STACKIT API to delete server err = p.client.DeleteServer(ctx, projectID, providerSpec.Region, serverID) if err != nil { diff --git a/pkg/provider/core_create_machine_basic_test.go b/pkg/provider/core_create_machine_basic_test.go index 30ef4a8b..1fc72358 100644 --- a/pkg/provider/core_create_machine_basic_test.go +++ b/pkg/provider/core_create_machine_basic_test.go @@ -184,7 +184,7 @@ var _ = Describe("CreateMachine", func() { Expect(err).To(HaveOccurred()) statusErr, ok := status.FromError(err) Expect(ok).To(BeTrue()) - Expect(statusErr.Code()).To(Equal(codes.Internal)) + Expect(statusErr.Code()).To(Equal(codes.Unavailable)) }) }) }) diff --git a/pkg/provider/core_delete_machine_test.go b/pkg/provider/core_delete_machine_test.go index da9684d4..e1b74bd9 100644 --- a/pkg/provider/core_delete_machine_test.go +++ b/pkg/provider/core_delete_machine_test.go @@ -114,7 +114,7 @@ var _ = Describe("DeleteMachine", func() { }) }) - Context("with missing or invalid ProviderID", func() { + XContext("with missing or invalid ProviderID", func() { It("should return InvalidArgument when ProviderID is missing", func() { machine.Spec.ProviderID = "" diff --git a/pkg/provider/sdk_client.go b/pkg/provider/sdk_client.go index c8a3dfab..1c0b95ac 100644 --- a/pkg/provider/sdk_client.go +++ b/pkg/provider/sdk_client.go @@ -89,21 +89,6 @@ func createIAASClient(serviceAccountKey string) (*iaas.APIClient, error) { // //nolint:gocyclo,funlen//TODO:refactor func (c *SdkStackitClient) CreateServer(ctx context.Context, projectID, region string, req *CreateServerRequest) (*Server, error) { - // Check if the server got already created - labelSelector := fmt.Sprintf("mcm.gardener.cloud/machine=%s", req.Name) - servers, err := c.ListServers(ctx, projectID, region, labelSelector) - if err != nil { - return nil, fmt.Errorf("SDK ListServers with labelSelector: %v failed: %w", labelSelector, err) - } - - if len(servers) > 1 { - return nil, fmt.Errorf("%v servers found for server name %v", len(servers), req.Name) - } - - if len(servers) == 1 { - return servers[0], nil - } - // Convert our request to SDK payload payload := &iaas.CreateServerPayload{ Name: ptr(req.Name), From 1d64de739116f8f84f4402259d662e9f273424ed Mon Sep 17 00:00:00 2001 From: Felix Breuer Date: Mon, 19 Jan 2026 12:17:00 +0100 Subject: [PATCH 4/7] add tests to allowedAddresses Signed-off-by: Felix Breuer --- pkg/provider/core.go | 58 ++------ .../core_create_machine_networking_test.go | 134 ++++++++++++++++++ pkg/provider/core_delete_machine_test.go | 9 +- pkg/provider/core_mocks_test.go | 2 +- 4 files changed, 153 insertions(+), 50 deletions(-) diff --git a/pkg/provider/core.go b/pkg/provider/core.go index 7f9f7c37..9dfc655a 100644 --- a/pkg/provider/core.go +++ b/pkg/provider/core.go @@ -11,14 +11,13 @@ import ( "errors" "fmt" "slices" - "time" + "strings" "github.com/gardener/machine-controller-manager/pkg/util/provider/driver" "github.com/gardener/machine-controller-manager/pkg/util/provider/machinecodes/codes" "github.com/gardener/machine-controller-manager/pkg/util/provider/machinecodes/status" api "github.com/stackitcloud/machine-controller-manager-provider-stackit/pkg/provider/apis" "github.com/stackitcloud/machine-controller-manager-provider-stackit/pkg/provider/apis/validation" - "k8s.io/apimachinery/pkg/util/wait" "k8s.io/klog/v2" ) @@ -202,12 +201,6 @@ func (p *Provider) CreateMachine(ctx context.Context, req *driver.CreateMachineR } } - //activeServer, err := p.waitForServerStatus(ctx, projectID, providerSpec.Region, server.ID) - //if err != nil { - //klog.Errorf("Server failed to become active for machine: %q: %v", req.Machine.Name, err) - //return nil, status.Error(codes.Unavailable, fmt.Sprintf("server failed to become active: %v", err)) - //} - if err := p.patchNetworkInterface(ctx, projectID, server.ID, providerSpec); err != nil { klog.Errorf("Failed to patch network interface for server %q: %v", req.Machine.Name, err) return nil, status.Error(codes.Unavailable, fmt.Sprintf("failed to patch network interface for server: %v", err)) @@ -243,51 +236,26 @@ func (p *Provider) getServerByName(ctx context.Context, projectID, region, serve return nil, nil } -func (p *Provider) waitForServerStatus(ctx context.Context, projectID, region, serverID string) (*Server, error) { - var server *Server - return server, wait.PollUntilContextTimeout( - ctx, - 10*time.Second, - time.Duration(120)*time.Second, - true, - func(_ context.Context) (done bool, err error) { - current, err := p.client.GetServer(ctx, projectID, region, serverID) - if err != nil { - return false, err - } - - klog.V(5).Infof("waiting for server [ID=%q] and current status %v, to reach status ACTIVE.", serverID, current.Status) - if current.Status == "ACTIVE" { - server = current - return true, nil - } - - if current.Status == "CREATING" || current.Status == "STARTING" { - return false, nil - } - - // TODO: maybe check for other status conditions here - retErr := fmt.Errorf("server [ID=%q] reached unexpected status %q", serverID, current.Status) - // if current.Status == "ERROR" { - // retErr = fmt.Errorf("%s, fault: %+v", retErr, current.Fault) - // } - - return false, retErr - }) -} - func (p *Provider) patchNetworkInterface(ctx context.Context, projectID, serverID string, providerSpec *api.ProviderSpec) error { + if len(providerSpec.AllowedAddresses) == 0 { + return nil + } + if providerSpec.Networking == nil { - // TODO: should we also patch nics from the default network? + // TODO: should we also patch nics if the machine is in the "default" network? return nil // return fmt.Errorf("failed to path allowedAddresses, providerspec.networking is nil") } nics, err := p.client.GetNICsForServer(ctx, projectID, providerSpec.Region, serverID) - if err != nil || len(nics) == 0 { + if err != nil { return fmt.Errorf("failed to get NICs for server %q: %w", serverID, err) } + if len(nics) == 0 { + return fmt.Errorf("failed to find NIC for server %q", serverID) + } + for _, nic := range nics { if providerSpec.Networking.NetworkID != nic.NetworkID && !slices.Contains(providerSpec.Networking.NICIDs, nic.ID) { continue @@ -339,6 +307,10 @@ func (p *Provider) DeleteMachine(ctx context.Context, req *driver.DeleteMachineR var projectID, serverID string var err error if req.Machine.Spec.ProviderID != "" { + if !strings.HasPrefix(req.Machine.Spec.ProviderID, StackitProviderName) { + return nil, status.Error(codes.InvalidArgument, fmt.Sprintf("providerID is not empty and does not start with stackit://")) + } + // Parse ProviderID to extract projectID and serverID projectID, serverID, err = parseProviderID(req.Machine.Spec.ProviderID) if err != nil { diff --git a/pkg/provider/core_create_machine_networking_test.go b/pkg/provider/core_create_machine_networking_test.go index 94122098..136e8ecb 100644 --- a/pkg/provider/core_create_machine_networking_test.go +++ b/pkg/provider/core_create_machine_networking_test.go @@ -147,6 +147,140 @@ var _ = Describe("CreateMachine - Networking", func() { Expect(capturedReq.Networking.NICIDs[0]).To(Equal("880e8400-e29b-41d4-a716-446655440001")) Expect(capturedReq.Networking.NICIDs[1]).To(Equal("990e8400-e29b-41d4-a716-446655440002")) }) + + It("should update the allowedAddresses in the NIC", func() { + providerSpec := &api.ProviderSpec{ + MachineType: "c1.2", + Region: "eu01", + ImageID: "12345678-1234-1234-1234-123456789abc", + Networking: &api.NetworkingSpec{ + NetworkID: "770e8400-e29b-41d4-a716-446655440000", + }, + AllowedAddresses: []string{ + "10.0.0.1/8", + }, + } + providerSpecRaw, _ := encodeProviderSpec(providerSpec) + + machineClass = &v1alpha1.MachineClass{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-machine-class", + }, + Provider: "stackit", + ProviderSpec: runtime.RawExtension{ + Raw: providerSpecRaw, + }, + } + + req = &driver.CreateMachineRequest{ + Machine: machine, + MachineClass: machineClass, + Secret: secret, + } + + var capturedReq *CreateServerRequest + mockClient.createServerFunc = func(_ context.Context, _, _ string, req *CreateServerRequest) (*Server, error) { + capturedReq = req + return &Server{ + ID: "test-server-id", + Name: req.Name, + Status: "CREATING", + }, nil + } + + mockClient.getNICsFunc = func(_ context.Context, _, _, _ string) ([]*NIC, error) { + return []*NIC{{ + ID: "990e8400-e29b-41d4-a716-446655440002", + NetworkID: "770e8400-e29b-41d4-a716-446655440000", + AllowedAddresses: []string{}, + }}, nil + } + + var called = false + mockClient.updateNICFunc = func(_ context.Context, _, _, _, _ string, addresses []string) (*NIC, error) { + called = true + Expect(addresses).To(HaveLen(1)) + Expect(addresses[0]).To(Equal("10.0.0.1/8")) + return &NIC{ + ID: "990e8400-e29b-41d4-a716-446655440002", + NetworkID: "770e8400-e29b-41d4-a716-446655440000", + AllowedAddresses: addresses, + }, nil + } + + _, err := provider.CreateMachine(ctx, req) + + Expect(err).NotTo(HaveOccurred()) + Expect(called).To(BeTrue()) + Expect(capturedReq.Networking).NotTo(BeNil()) + Expect(capturedReq.Networking.NetworkID).ToNot(BeEmpty()) + }) + + It("should not update the allowedAddresses in the NIC if already present", func() { + providerSpec := &api.ProviderSpec{ + MachineType: "c1.2", + Region: "eu01", + ImageID: "12345678-1234-1234-1234-123456789abc", + Networking: &api.NetworkingSpec{ + NetworkID: "770e8400-e29b-41d4-a716-446655440000", + }, + AllowedAddresses: []string{ + "10.0.0.1/8", + }, + } + providerSpecRaw, _ := encodeProviderSpec(providerSpec) + + machineClass = &v1alpha1.MachineClass{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-machine-class", + }, + Provider: "stackit", + ProviderSpec: runtime.RawExtension{ + Raw: providerSpecRaw, + }, + } + + req = &driver.CreateMachineRequest{ + Machine: machine, + MachineClass: machineClass, + Secret: secret, + } + + var capturedReq *CreateServerRequest + mockClient.createServerFunc = func(_ context.Context, _, _ string, req *CreateServerRequest) (*Server, error) { + capturedReq = req + return &Server{ + ID: "test-server-id", + Name: req.Name, + Status: "CREATING", + }, nil + } + + mockClient.getNICsFunc = func(_ context.Context, _, _, _ string) ([]*NIC, error) { + return []*NIC{{ + ID: "990e8400-e29b-41d4-a716-446655440002", + NetworkID: "770e8400-e29b-41d4-a716-446655440000", + AllowedAddresses: []string{"10.0.0.1/8"}, + }}, nil + } + + var called = false + mockClient.updateNICFunc = func(_ context.Context, _, _, _, _ string, addresses []string) (*NIC, error) { + called = true + return &NIC{ + ID: "990e8400-e29b-41d4-a716-446655440002", + NetworkID: "770e8400-e29b-41d4-a716-446655440000", + AllowedAddresses: addresses, + }, nil + } + + _, err := provider.CreateMachine(ctx, req) + + Expect(err).NotTo(HaveOccurred()) + Expect(called).To(BeFalse()) + Expect(capturedReq.Networking).NotTo(BeNil()) + Expect(capturedReq.Networking.NetworkID).ToNot(BeEmpty()) + }) }) Context("with networking fallback to Secret", func() { diff --git a/pkg/provider/core_delete_machine_test.go b/pkg/provider/core_delete_machine_test.go index e1b74bd9..a4d9720b 100644 --- a/pkg/provider/core_delete_machine_test.go +++ b/pkg/provider/core_delete_machine_test.go @@ -114,16 +114,13 @@ var _ = Describe("DeleteMachine", func() { }) }) - XContext("with missing or invalid ProviderID", func() { - It("should return InvalidArgument when ProviderID is missing", func() { + Context("with missing or invalid ProviderID", func() { + It("should still delete the machine when ProviderID is missing", func() { machine.Spec.ProviderID = "" _, err := provider.DeleteMachine(ctx, req) - Expect(err).To(HaveOccurred()) - statusErr, ok := status.FromError(err) - Expect(ok).To(BeTrue()) - Expect(statusErr.Code()).To(Equal(codes.InvalidArgument)) + Expect(err).To(BeNil()) }) It("should return InvalidArgument when ProviderID has invalid format", func() { diff --git a/pkg/provider/core_mocks_test.go b/pkg/provider/core_mocks_test.go index fb4fd033..fdf7e3fd 100644 --- a/pkg/provider/core_mocks_test.go +++ b/pkg/provider/core_mocks_test.go @@ -65,7 +65,7 @@ func (m *mockStackitClient) GetNICsForServer(ctx context.Context, projectID, reg } func (m *mockStackitClient) UpdateNIC(ctx context.Context, projectID, region, networkID, nicID string, allowedAddresses []string) (*NIC, error) { - if m.listServersFunc != nil { + if m.updateNICFunc != nil { return m.updateNICFunc(ctx, projectID, region, networkID, nicID, allowedAddresses) } return &NIC{}, nil From 186eef8bf7b4b8a963f96b1193f2c9f680a3bbb6 Mon Sep 17 00:00:00 2001 From: Felix Breuer Date: Mon, 19 Jan 2026 14:01:22 +0100 Subject: [PATCH 5/7] fix linter Signed-off-by: Felix Breuer --- pkg/provider/core.go | 3 +-- pkg/provider/core_delete_machine_test.go | 2 +- pkg/provider/sdk_client.go | 16 ++++++++-------- pkg/provider/stackit_client.go | 1 + 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/pkg/provider/core.go b/pkg/provider/core.go index 9dfc655a..f20328da 100644 --- a/pkg/provider/core.go +++ b/pkg/provider/core.go @@ -244,7 +244,6 @@ func (p *Provider) patchNetworkInterface(ctx context.Context, projectID, serverI if providerSpec.Networking == nil { // TODO: should we also patch nics if the machine is in the "default" network? return nil - // return fmt.Errorf("failed to path allowedAddresses, providerspec.networking is nil") } nics, err := p.client.GetNICsForServer(ctx, projectID, providerSpec.Region, serverID) @@ -308,7 +307,7 @@ func (p *Provider) DeleteMachine(ctx context.Context, req *driver.DeleteMachineR var err error if req.Machine.Spec.ProviderID != "" { if !strings.HasPrefix(req.Machine.Spec.ProviderID, StackitProviderName) { - return nil, status.Error(codes.InvalidArgument, fmt.Sprintf("providerID is not empty and does not start with stackit://")) + return nil, status.Error(codes.InvalidArgument, "providerID is not empty and does not start with stackit://") } // Parse ProviderID to extract projectID and serverID diff --git a/pkg/provider/core_delete_machine_test.go b/pkg/provider/core_delete_machine_test.go index a4d9720b..a748d062 100644 --- a/pkg/provider/core_delete_machine_test.go +++ b/pkg/provider/core_delete_machine_test.go @@ -120,7 +120,7 @@ var _ = Describe("DeleteMachine", func() { _, err := provider.DeleteMachine(ctx, req) - Expect(err).To(BeNil()) + Expect(err).ToNot(HaveOccurred()) }) It("should return InvalidArgument when ProviderID has invalid format", func() { diff --git a/pkg/provider/sdk_client.go b/pkg/provider/sdk_client.go index 1c0b95ac..97c8c864 100644 --- a/pkg/provider/sdk_client.go +++ b/pkg/provider/sdk_client.go @@ -87,7 +87,7 @@ func createIAASClient(serviceAccountKey string) (*iaas.APIClient, error) { // CreateServer creates a new server via STACKIT SDK // -//nolint:gocyclo,funlen//TODO:refactor +//nolint:gocyclo // TODO: refactor func (c *SdkStackitClient) CreateServer(ctx context.Context, projectID, region string, req *CreateServerRequest) (*Server, error) { // Convert our request to SDK payload payload := &iaas.CreateServerPayload{ @@ -301,19 +301,19 @@ func (c *SdkStackitClient) GetNICsForServer(ctx context.Context, projectID, regi nics := make([]*NIC, 0) for _, nic := range *res.Items { - nics = append(nics, convertSDKNICtoNIC(nic)) + nics = append(nics, convertSDKNICtoNIC(&nic)) } return nics, nil } func (c *SdkStackitClient) UpdateNIC(ctx context.Context, projectID, region, networkID, nicID string, allowedAddresses []string) (*NIC, error) { - addresses := make([]iaas.AllowedAddressesInner, 0) + addresses := make([]iaas.AllowedAddressesInner, len(allowedAddresses)) - for _, addr := range allowedAddresses { - addresses = append(addresses, iaas.AllowedAddressesInner{ + for i, addr := range allowedAddresses { + addresses[i] = iaas.AllowedAddressesInner{ String: ptr(addr), - }) + } } payload := iaas.UpdateNicPayload{ @@ -329,12 +329,12 @@ func (c *SdkStackitClient) UpdateNIC(ctx context.Context, projectID, region, net return nil, nil } - return convertSDKNICtoNIC(*sdkNic), nil + return convertSDKNICtoNIC(sdkNic), nil } // Helper functions -func convertSDKNICtoNIC(nic iaas.NIC) *NIC { +func convertSDKNICtoNIC(nic *iaas.NIC) *NIC { addresses := make([]string, 0) if nic.AllowedAddresses != nil { for _, addr := range *nic.AllowedAddresses { diff --git a/pkg/provider/stackit_client.go b/pkg/provider/stackit_client.go index c9d4d8ef..2f7b9f6b 100644 --- a/pkg/provider/stackit_client.go +++ b/pkg/provider/stackit_client.go @@ -18,6 +18,7 @@ import ( // // Note: region parameter is required by STACKIT SDK v1.0.0+ // It must be extracted from the Secret (e.g., "eu01-1", "eu01-2") +// nolint:dupl // the duplicates are mock functions type StackitClient interface { // CreateServer creates a new server in STACKIT CreateServer(ctx context.Context, projectID, region string, req *CreateServerRequest) (*Server, error) From 00165b0fb6bc3485f8ac834ff378f8261925caf1 Mon Sep 17 00:00:00 2001 From: Felix Breuer Date: Tue, 20 Jan 2026 11:40:46 +0100 Subject: [PATCH 6/7] resolve comments Signed-off-by: Felix Breuer --- go.mod | 65 ++++---- go.sum | 145 ++++++++++-------- pkg/provider/core.go | 22 +-- .../core_create_machine_networking_test.go | 73 ++++++++- pkg/provider/core_list_machines_test.go | 10 +- pkg/provider/core_mocks_test.go | 4 +- pkg/provider/sdk_client.go | 12 +- pkg/provider/stackit_client.go | 2 +- 8 files changed, 211 insertions(+), 122 deletions(-) diff --git a/go.mod b/go.mod index 53952c94..a1698d13 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/stackitcloud/machine-controller-manager-provider-stackit -go 1.24.5 +go 1.24.0 require ( github.com/gardener/machine-controller-manager v0.60.2 @@ -21,13 +21,12 @@ require ( github.com/blang/semver/v4 v4.0.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/emicklei/go-restful/v3 v3.13.0 // indirect + github.com/emicklei/go-restful/v3 v3.12.2 // indirect github.com/fxamacker/cbor/v2 v2.9.0 // indirect github.com/go-logr/logr v1.4.3 // indirect - github.com/go-openapi/jsonpointer v0.22.1 // indirect - github.com/go-openapi/jsonreference v0.21.2 // indirect - github.com/go-openapi/swag v0.23.1 // indirect - github.com/go-openapi/swag/jsonname v0.25.1 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect + github.com/go-openapi/swag v0.23.0 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang-jwt/jwt/v5 v5.3.0 // indirect @@ -37,42 +36,42 @@ require ( github.com/google/uuid v1.6.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/josharian/intern v1.0.0 // indirect - github.com/json-iterator/go v1.1.13-0.20220915233716-71ac16282d12 // indirect - github.com/klauspost/compress v1.18.1 // indirect - github.com/mailru/easyjson v0.9.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/mailru/easyjson v0.7.7 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.23.2 // indirect - github.com/prometheus/client_model v0.6.2 // indirect - github.com/prometheus/common v0.67.4 // indirect - github.com/prometheus/procfs v0.17.0 // indirect - github.com/spf13/cobra v1.10.2 // indirect + github.com/prometheus/client_golang v1.22.0 // indirect + github.com/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/common v0.62.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect + github.com/spf13/cobra v1.9.1 // indirect github.com/x448/float16 v0.8.4 // indirect - go.opentelemetry.io/otel v1.38.0 // indirect - go.opentelemetry.io/otel/trace v1.38.0 // indirect - go.yaml.in/yaml/v2 v2.4.3 // indirect + go.opentelemetry.io/otel v1.35.0 // indirect + go.opentelemetry.io/otel/trace v1.35.0 // indirect + go.yaml.in/yaml/v2 v2.4.2 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/mod v0.31.0 // indirect - golang.org/x/net v0.48.0 // indirect - golang.org/x/oauth2 v0.32.0 // indirect - golang.org/x/sync v0.19.0 // indirect - golang.org/x/sys v0.39.0 // indirect - golang.org/x/term v0.38.0 // indirect - golang.org/x/text v0.32.0 // indirect - golang.org/x/time v0.14.0 // indirect - golang.org/x/tools v0.40.0 // indirect - google.golang.org/protobuf v1.36.10 // indirect - gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect + golang.org/x/mod v0.27.0 // indirect + golang.org/x/net v0.43.0 // indirect + golang.org/x/oauth2 v0.27.0 // indirect + golang.org/x/sync v0.16.0 // indirect + golang.org/x/sys v0.35.0 // indirect + golang.org/x/term v0.34.0 // indirect + golang.org/x/text v0.28.0 // indirect + golang.org/x/time v0.9.0 // indirect + golang.org/x/tools v0.36.0 // indirect + google.golang.org/protobuf v1.36.7 // indirect + gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/apiserver v0.34.3 // indirect + k8s.io/apiserver v0.31.0 // indirect k8s.io/client-go v0.34.3 // indirect - k8s.io/cluster-bootstrap v0.34.3 // indirect - k8s.io/kube-openapi v0.0.0-20250814151709-d7b6acb124c3 // indirect - k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 // indirect - sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect + k8s.io/cluster-bootstrap v0.31.0 // indirect + k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b // indirect + k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 // indirect + sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect sigs.k8s.io/randfill v1.0.0 // indirect sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect sigs.k8s.io/yaml v1.6.0 // indirect diff --git a/go.sum b/go.sum index eef9c64f..1ea4d591 100644 --- a/go.sum +++ b/go.sum @@ -7,12 +7,13 @@ github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2y github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/emicklei/go-restful/v3 v3.13.0 h1:C4Bl2xDndpU6nJ4bc1jXd+uTmYPVUwkD6bFY/oTyCes= -github.com/emicklei/go-restful/v3 v3.13.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.12.2 h1:DhwDP0vY3k8ZzE0RunuJy8GhNpPL6zqLkDf9B/a0/xU= +github.com/emicklei/go-restful/v3 v3.12.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/gardener/machine-controller-manager v0.60.2 h1:lY6z67lDlwl9dQUEmlJbrmpxWK10o/rVRUu4JB7xK4U= @@ -27,14 +28,14 @@ github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= -github.com/go-openapi/jsonpointer v0.22.1 h1:sHYI1He3b9NqJ4wXLoJDKmUmHkWy/L7rtEo92JUxBNk= -github.com/go-openapi/jsonpointer v0.22.1/go.mod h1:pQT9OsLkfz1yWoMgYFy4x3U5GY5nUlsOn1qSBH5MkCM= -github.com/go-openapi/jsonreference v0.21.2 h1:Wxjda4M/BBQllegefXrY/9aq1fxBA8sI5M/lFU6tSWU= -github.com/go-openapi/jsonreference v0.21.2/go.mod h1:pp3PEjIsJ9CZDGCNOyXIQxsNuroxm8FAJ/+quA0yKzQ= -github.com/go-openapi/swag v0.23.1 h1:lpsStH0n2ittzTnbaSloVZLuB5+fvSY/+hnagBjSNZU= -github.com/go-openapi/swag v0.23.1/go.mod h1:STZs8TbRvEQQKUA+JZNAm3EWlgaOBGpyFDqQnDHMef0= -github.com/go-openapi/swag/jsonname v0.25.1 h1:Sgx+qbwa4ej6AomWC6pEfXrA6uP2RkaNjA9BR8a1RJU= -github.com/go-openapi/swag/jsonname v0.25.1/go.mod h1:71Tekow6UOLBD3wS7XhdT98g5J5GR13NOTQ9/6Q11Zo= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= @@ -58,20 +59,23 @@ github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8Hm github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/joshdk/go-junit v1.0.0 h1:S86cUKIdwBHWwA6xCmFlf3RTLfVXYQfvanM5Uh+K6GE= github.com/joshdk/go-junit v1.0.0/go.mod h1:TiiV0PqkaNfFXjEiyjWM3XXrhVyCa1K4Zfga6W52ung= -github.com/json-iterator/go v1.1.13-0.20220915233716-71ac16282d12 h1:9Nu54bhS/H/Kgo2/7xNSUuC5G28VR8ljfrLKU2G4IjU= -github.com/json-iterator/go v1.1.13-0.20220915233716-71ac16282d12/go.mod h1:TBzl5BIHNXfS9+C35ZyJaklL7mLDbgUkcgXzSLa8Tk0= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= 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.18.1 h1:bcSGx7UbpBqMChDtsF28Lw6v/G94LPrrbMbdC3JH2co= -github.com/klauspost/compress v1.18.1/go.mod h1:ZQFFVG+MdnR0P+l6wpXgIL4NTtwiKIdBnrBd8Nrxr+0= +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/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= -github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo= github.com/maruel/natural v1.1.1/go.mod h1:v+Rfd79xlw1AgVBjbO0BEQmptqb5HvL/k9GRHB7ZKEg= github.com/mfridman/tparse v0.18.0 h1:wh6dzOKaIwkUGyKgOntDW4liXSo37qg5AXbIhkMV3vE= @@ -88,23 +92,25 @@ github.com/onsi/ginkgo/v2 v2.27.5 h1:ZeVgZMx2PDMdJm/+w5fE/OyG6ILo1Y3e+QX4zSR0zTE github.com/onsi/ginkgo/v2 v2.27.5/go.mod h1:ArE1D/XhNXBXCBkKOLkbsb2c81dQHCRcF5zwn/ykDRo= github.com/onsi/gomega v1.39.0 h1:y2ROC3hKFmQZJNFeGAMeHZKkjBL65mIZcvrLQBF9k6Q= github.com/onsi/gomega v1.39.0/go.mod h1:ZCU1pkQcXDO5Sl9/VVEGlDyp+zm0m1cmeG5TOzLgdh4= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= -github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= -github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= -github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= -github.com/prometheus/common v0.67.4 h1:yR3NqWO1/UyO1w2PhUvXlGQs/PtFmoveVO0KZ4+Lvsc= -github.com/prometheus/common v0.67.4/go.mod h1:gP0fq6YjjNCLssJCQp0yk4M8W6ikLURwkdd/YKtTbyI= -github.com/prometheus/procfs v0.17.0 h1:FuLQ+05u4ZI+SS/w9+BWEM2TXiHKsUQ9TADiRH7DuK0= -github.com/prometheus/procfs v0.17.0/go.mod h1:oPQLaDAMRbA+u8H5Pbfq+dl3VDAvHxMUOVhe0wYB2zw= +github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= +github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= +github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= -github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= -github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= +github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= +github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stackitcloud/stackit-sdk-go/core v0.20.1 h1:odiuhhRXmxvEvnVTeZSN9u98edvw2Cd3DcnkepncP3M= @@ -113,12 +119,15 @@ github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.0 h1:U/x0tc487X9msMS5y github.com/stackitcloud/stackit-sdk-go/services/iaas v1.3.0/go.mod h1:6+5+RCDfU7eQN3+/SGdOtx7Bq9dEa2FrHz/jflgY1M4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= -github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= @@ -131,18 +140,18 @@ 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/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= -go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= -go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= -go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= +go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= +go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= +go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= +go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= -go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= -go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= +go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= +go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -150,51 +159,51 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.31.0 h1:HaW9xtz0+kOcWKwli0ZXy79Ix+UW/vOfmWI5QVd2tgI= -golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg= +golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ= +golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU= -golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY= -golang.org/x/oauth2 v0.32.0 h1:jsCblLleRMDrxMN29H3z/k1KliIvpLgCkE6R8FXXNgY= -golang.org/x/oauth2 v0.32.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= +golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= +golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= +golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M= +golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= -golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= +golang.org/x/sync v0.16.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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= -golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/term v0.38.0 h1:PQ5pkm/rLO6HnxFR7N2lJHOZX6Kez5Y1gDSJla6jo7Q= -golang.org/x/term v0.38.0/go.mod h1:bSEAKrOT1W+VSu9TSCMtoGEOUcKxOKgl3LE5QEF/xVg= +golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= +golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4= +golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= -golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= -golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= -golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= +golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= +golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= +golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY= +golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.40.0 h1:yLkxfA+Qnul4cs9QA3KnlFu0lVmd8JJfoq+E41uSutA= -golang.org/x/tools v0.40.0/go.mod h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc= +golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg= +golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= -google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A= +google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/evanphx/json-patch.v4 v4.13.0 h1:czT3CmqEaQ1aanPc5SdlgQrrEIb8w/wwCvWWnfEbYzo= -gopkg.in/evanphx/json-patch.v4 v4.13.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= +gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= +gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -204,25 +213,25 @@ k8s.io/api v0.34.3 h1:D12sTP257/jSH2vHV2EDYrb16bS7ULlHpdNdNhEw2S4= k8s.io/api v0.34.3/go.mod h1:PyVQBF886Q5RSQZOim7DybQjAbVs8g7gwJNhGtY5MBk= k8s.io/apimachinery v0.34.3 h1:/TB+SFEiQvN9HPldtlWOTp0hWbJ+fjU+wkxysf/aQnE= k8s.io/apimachinery v0.34.3/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw= -k8s.io/apiserver v0.34.3 h1:uGH1qpDvSiYG4HVFqc6A3L4CKiX+aBWDrrsxHYK0Bdo= -k8s.io/apiserver v0.34.3/go.mod h1:QPnnahMO5C2m3lm6fPW3+JmyQbvHZQ8uudAu/493P2w= +k8s.io/apiserver v0.31.0 h1:p+2dgJjy+bk+B1Csz+mc2wl5gHwvNkC9QJV+w55LVrY= +k8s.io/apiserver v0.31.0/go.mod h1:KI9ox5Yu902iBnnyMmy7ajonhKnkeZYJhTZ/YI+WEMk= k8s.io/client-go v0.34.3 h1:wtYtpzy/OPNYf7WyNBTj3iUA0XaBHVqhv4Iv3tbrF5A= k8s.io/client-go v0.34.3/go.mod h1:OxxeYagaP9Kdf78UrKLa3YZixMCfP6bgPwPwNBQBzpM= -k8s.io/cluster-bootstrap v0.34.3 h1:mLguWldCwTk0GvoWHg6tf6qgpVMDLCSvvtWUoL13RXg= -k8s.io/cluster-bootstrap v0.34.3/go.mod h1:50AJCDVJ8HMmw9W2EN0cHSbTsI9GYtyOM+eyxjVlAwg= +k8s.io/cluster-bootstrap v0.31.0 h1:jj5t1PArBPddvDypdNpzqnZQ/+qnGxpJuTF7SX05h1Y= +k8s.io/cluster-bootstrap v0.31.0/go.mod h1:6ujqWFrBV4amKe1ii/6BXgrd57bF/Q3gXebLJdmfSK4= k8s.io/component-base v0.34.3 h1:zsEgw6ELqK0XncCQomgO9DpUIzlrYuZYA0Cgo+JWpVk= k8s.io/component-base v0.34.3/go.mod h1:5iIlD8wPfWE/xSHTRfbjuvUul2WZbI2nOUK65XL0E/c= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20250814151709-d7b6acb124c3 h1:liMHz39T5dJO1aOKHLvwaCjDbf07wVh6yaUlTpunnkE= -k8s.io/kube-openapi v0.0.0-20250814151709-d7b6acb124c3/go.mod h1:UZ2yyWbFTpuhSbFhv24aGNOdoRdJZgsIObGBUaYVsts= -k8s.io/utils v0.0.0-20251002143259-bc988d571ff4 h1:SjGebBtkBqHFOli+05xYbK8YF1Dzkbzn+gDM4X9T4Ck= -k8s.io/utils v0.0.0-20251002143259-bc988d571ff4/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= -sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= +k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b h1:MloQ9/bdJyIu9lb1PzujOPolHyvO06MXG5TUIj2mNAA= +k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b/go.mod h1:UZ2yyWbFTpuhSbFhv24aGNOdoRdJZgsIObGBUaYVsts= +k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8tmbZBHi4zVsl1Y= +k8s.io/utils v0.0.0-20250604170112-4c0f3b243397/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE= +sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco= sigs.k8s.io/structured-merge-diff/v6 v6.3.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= -sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= +sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= \ No newline at end of file diff --git a/pkg/provider/core.go b/pkg/provider/core.go index f20328da..eaaf7d35 100644 --- a/pkg/provider/core.go +++ b/pkg/provider/core.go @@ -218,7 +218,9 @@ func (p *Provider) CreateMachine(ctx context.Context, req *driver.CreateMachineR func (p *Provider) getServerByName(ctx context.Context, projectID, region, serverName string) (*Server, error) { // Check if the server got already created - labelSelector := fmt.Sprintf("mcm.gardener.cloud/machine=%s", serverName) + labelSelector := map[string]string{ + "mcm.gardener.cloud/machine": "serverName", + } servers, err := p.client.ListServers(ctx, projectID, region, labelSelector) if err != nil { return nil, fmt.Errorf("SDK ListServers with labelSelector: %v failed: %w", labelSelector, err) @@ -241,11 +243,6 @@ func (p *Provider) patchNetworkInterface(ctx context.Context, projectID, serverI return nil } - if providerSpec.Networking == nil { - // TODO: should we also patch nics if the machine is in the "default" network? - return nil - } - nics, err := p.client.GetNICsForServer(ctx, projectID, providerSpec.Region, serverID) if err != nil { return fmt.Errorf("failed to get NICs for server %q: %w", serverID, err) @@ -256,8 +253,13 @@ func (p *Provider) patchNetworkInterface(ctx context.Context, projectID, serverI } for _, nic := range nics { - if providerSpec.Networking.NetworkID != nic.NetworkID && !slices.Contains(providerSpec.Networking.NICIDs, nic.ID) { - continue + // if networking is not set, server is inside the default network + // just patch the interface since the server should only have one + if providerSpec.Networking != nil { + // only process interfaces that are either in the configured network (NetworkID) or are defined in NICIDs + if providerSpec.Networking.NetworkID != nic.NetworkID && !slices.Contains(providerSpec.Networking.NICIDs, nic.ID) { + continue + } } updateNic := false @@ -463,7 +465,9 @@ func (p *Provider) ListMachines(ctx context.Context, req *driver.ListMachinesReq } // Call STACKIT API to list all servers - labelSelector := fmt.Sprintf("%s=%s", StackitMachineClassLabel, req.MachineClass.Name) + labelSelector := map[string]string{ + StackitMachineClassLabel: req.MachineClass.Name, + } servers, err := p.client.ListServers(ctx, projectID, providerSpec.Region, labelSelector) if err != nil { klog.Errorf("Failed to list servers for MachineClass %q: %v", req.MachineClass.Name, err) diff --git a/pkg/provider/core_create_machine_networking_test.go b/pkg/provider/core_create_machine_networking_test.go index 136e8ecb..b8649d93 100644 --- a/pkg/provider/core_create_machine_networking_test.go +++ b/pkg/provider/core_create_machine_networking_test.go @@ -148,7 +148,7 @@ var _ = Describe("CreateMachine - Networking", func() { Expect(capturedReq.Networking.NICIDs[1]).To(Equal("990e8400-e29b-41d4-a716-446655440002")) }) - It("should update the allowedAddresses in the NIC", func() { + It("should update the allowedAddresses in the NIC when networkID is set", func() { providerSpec := &api.ProviderSpec{ MachineType: "c1.2", Region: "eu01", @@ -216,6 +216,77 @@ var _ = Describe("CreateMachine - Networking", func() { Expect(capturedReq.Networking.NetworkID).ToNot(BeEmpty()) }) + It("should update the allowedAddresses in the NIC when NICIDs are set", func() { + providerSpec := &api.ProviderSpec{ + MachineType: "c1.2", + Region: "eu01", + ImageID: "12345678-1234-1234-1234-123456789abc", + Networking: &api.NetworkingSpec{ + NICIDs: []string{ + "880e8400-e29b-41d4-a716-446655440001", + "990e8400-e29b-41d4-a716-446655440002", + }, + }, + AllowedAddresses: []string{ + "10.0.0.1/8", + }, + } + providerSpecRaw, _ := encodeProviderSpec(providerSpec) + + machineClass = &v1alpha1.MachineClass{ + ObjectMeta: metav1.ObjectMeta{ + Name: "test-machine-class", + }, + Provider: "stackit", + ProviderSpec: runtime.RawExtension{ + Raw: providerSpecRaw, + }, + } + + req = &driver.CreateMachineRequest{ + Machine: machine, + MachineClass: machineClass, + Secret: secret, + } + + var capturedReq *CreateServerRequest + mockClient.createServerFunc = func(_ context.Context, _, _ string, req *CreateServerRequest) (*Server, error) { + capturedReq = req + return &Server{ + ID: "test-server-id", + Name: req.Name, + Status: "CREATING", + }, nil + } + + mockClient.getNICsFunc = func(_ context.Context, _, _, _ string) ([]*NIC, error) { + return []*NIC{{ + ID: "880e8400-e29b-41d4-a716-446655440001", + NetworkID: "770e8400-e29b-41d4-a716-446655440000", + AllowedAddresses: []string{}, + }}, nil + } + + var called = false + mockClient.updateNICFunc = func(_ context.Context, _, _, _, _ string, addresses []string) (*NIC, error) { + called = true + Expect(addresses).To(HaveLen(1)) + Expect(addresses[0]).To(Equal("10.0.0.1/8")) + return &NIC{ + ID: "880e8400-e29b-41d4-a716-446655440001", + NetworkID: "770e8400-e29b-41d4-a716-446655440000", + AllowedAddresses: addresses, + }, nil + } + + _, err := provider.CreateMachine(ctx, req) + + Expect(err).NotTo(HaveOccurred()) + Expect(called).To(BeTrue()) + Expect(capturedReq.Networking).NotTo(BeNil()) + Expect(capturedReq.Networking.NICIDs).To(HaveLen(2)) + }) + It("should not update the allowedAddresses in the NIC if already present", func() { providerSpec := &api.ProviderSpec{ MachineType: "c1.2", diff --git a/pkg/provider/core_list_machines_test.go b/pkg/provider/core_list_machines_test.go index 817ca691..0e201372 100644 --- a/pkg/provider/core_list_machines_test.go +++ b/pkg/provider/core_list_machines_test.go @@ -72,8 +72,8 @@ var _ = Describe("ListMachines", func() { Context("with valid inputs", func() { It("should list machines filtered by MachineClass label", func() { - mockClient.listServersFunc = func(_ context.Context, _, _, selector string) ([]*Server, error) { - Expect(selector).To(ContainSubstring("mcm.gardener.cloud/machineclass=test-machine-class")) + mockClient.listServersFunc = func(_ context.Context, _, _ string, selector map[string]string) ([]*Server, error) { + Expect(selector["mcm.gardener.cloud/machineclass"]).To(Equal("test-machine-class")) return []*Server{ { @@ -106,7 +106,7 @@ var _ = Describe("ListMachines", func() { }) It("should return empty list when no servers match", func() { - mockClient.listServersFunc = func(_ context.Context, _, _, _ string) ([]*Server, error) { + mockClient.listServersFunc = func(_ context.Context, _, _ string, _ map[string]string) ([]*Server, error) { return []*Server{}, nil } @@ -118,7 +118,7 @@ var _ = Describe("ListMachines", func() { }) It("should return empty list when no servers exist", func() { - mockClient.listServersFunc = func(_ context.Context, _, _, _ string) ([]*Server, error) { + mockClient.listServersFunc = func(_ context.Context, _, _ string, _ map[string]string) ([]*Server, error) { return []*Server{}, nil } @@ -132,7 +132,7 @@ var _ = Describe("ListMachines", func() { Context("when STACKIT API fails", func() { It("should return Internal error on API failure", func() { - mockClient.listServersFunc = func(_ context.Context, _, _, _ string) ([]*Server, error) { + mockClient.listServersFunc = func(_ context.Context, _, _ string, _ map[string]string) ([]*Server, error) { return nil, fmt.Errorf("API connection failed") } diff --git a/pkg/provider/core_mocks_test.go b/pkg/provider/core_mocks_test.go index fdf7e3fd..ce4388c8 100644 --- a/pkg/provider/core_mocks_test.go +++ b/pkg/provider/core_mocks_test.go @@ -16,7 +16,7 @@ type mockStackitClient struct { createServerFunc func(ctx context.Context, projectID, region string, req *CreateServerRequest) (*Server, error) getServerFunc func(ctx context.Context, projectID, region, serverID string) (*Server, error) deleteServerFunc func(ctx context.Context, projectID, region, serverID string) error - listServersFunc func(ctx context.Context, projectID, region, labelSelector string) ([]*Server, error) + listServersFunc func(ctx context.Context, projectID, region string, labelSelector map[string]string) ([]*Server, error) getNICsFunc func(ctx context.Context, projectID, region, serverID string) ([]*NIC, error) updateNICFunc func(ctx context.Context, projectID, region, networkID, nicID string, allowedAddresses []string) (*NIC, error) } @@ -50,7 +50,7 @@ func (m *mockStackitClient) DeleteServer(ctx context.Context, projectID, region, return nil } -func (m *mockStackitClient) ListServers(ctx context.Context, projectID, region, labelSelector string) ([]*Server, error) { +func (m *mockStackitClient) ListServers(ctx context.Context, projectID, region string, labelSelector map[string]string) ([]*Server, error) { if m.listServersFunc != nil { return m.listServersFunc(ctx, projectID, region, labelSelector) } diff --git a/pkg/provider/sdk_client.go b/pkg/provider/sdk_client.go index 97c8c864..13a58dca 100644 --- a/pkg/provider/sdk_client.go +++ b/pkg/provider/sdk_client.go @@ -258,11 +258,16 @@ func (c *SdkStackitClient) DeleteServer(ctx context.Context, projectID, region, } // ListServers lists all servers in a project via STACKIT SDK -func (c *SdkStackitClient) ListServers(ctx context.Context, projectID, region, labelSelector string) ([]*Server, error) { +func (c *SdkStackitClient) ListServers(ctx context.Context, projectID, region string, labelSelector map[string]string) ([]*Server, error) { serverRequest := c.iaasClient.ListServers(ctx, projectID, region) - if labelSelector != "" { - serverRequest = serverRequest.LabelSelector(labelSelector) + if labelSelector != nil { + labelSelectorString := "" + for k, v := range labelSelector { + labelSelectorString += fmt.Sprintf("%s=%s,", k, v) + } + + serverRequest = serverRequest.LabelSelector(labelSelectorString) } sdkResponse, err := serverRequest.Execute() @@ -343,6 +348,7 @@ func convertSDKNICtoNIC(nic *iaas.NIC) *NIC { } } } + nic.GetId() return &NIC{ ID: getStringValue(nic.Id), diff --git a/pkg/provider/stackit_client.go b/pkg/provider/stackit_client.go index 2f7b9f6b..0fe44be9 100644 --- a/pkg/provider/stackit_client.go +++ b/pkg/provider/stackit_client.go @@ -27,7 +27,7 @@ type StackitClient interface { // DeleteServer deletes a server by ID from STACKIT DeleteServer(ctx context.Context, projectID, region, serverID string) error // ListServers lists all servers in a project - ListServers(ctx context.Context, projectID, region, labelSelector string) ([]*Server, error) + ListServers(ctx context.Context, projectID, region string, labelSelector map[string]string) ([]*Server, error) // GetNICsForServer retrieves a network interfaces for a given server GetNICsForServer(ctx context.Context, projectID, region, serverID string) ([]*NIC, error) // UpdateNIC updates a network interface From 70ee4c3590d52bd2fa19904814687a9c5a8f9042 Mon Sep 17 00:00:00 2001 From: Felix Breuer Date: Wed, 21 Jan 2026 11:37:05 +0100 Subject: [PATCH 7/7] resolve comments Signed-off-by: Felix Breuer --- pkg/provider/core.go | 2 +- pkg/provider/sdk_client.go | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/pkg/provider/core.go b/pkg/provider/core.go index eaaf7d35..0dcad840 100644 --- a/pkg/provider/core.go +++ b/pkg/provider/core.go @@ -219,7 +219,7 @@ func (p *Provider) CreateMachine(ctx context.Context, req *driver.CreateMachineR func (p *Provider) getServerByName(ctx context.Context, projectID, region, serverName string) (*Server, error) { // Check if the server got already created labelSelector := map[string]string{ - "mcm.gardener.cloud/machine": "serverName", + StackitMachineLabel: serverName, } servers, err := p.client.ListServers(ctx, projectID, region, labelSelector) if err != nil { diff --git a/pkg/provider/sdk_client.go b/pkg/provider/sdk_client.go index 13a58dca..fb489083 100644 --- a/pkg/provider/sdk_client.go +++ b/pkg/provider/sdk_client.go @@ -9,6 +9,7 @@ import ( "errors" "fmt" "os" + "strings" "github.com/stackitcloud/stackit-sdk-go/core/config" "github.com/stackitcloud/stackit-sdk-go/core/oapierror" @@ -262,12 +263,15 @@ func (c *SdkStackitClient) ListServers(ctx context.Context, projectID, region st serverRequest := c.iaasClient.ListServers(ctx, projectID, region) if labelSelector != nil { - labelSelectorString := "" + sb := strings.Builder{} for k, v := range labelSelector { - labelSelectorString += fmt.Sprintf("%s=%s,", k, v) + _, err := fmt.Fprintf(&sb, "%s=%s,", k, v) + if err != nil { + return nil, fmt.Errorf("failed to format label selector: %w", err) + } } - serverRequest = serverRequest.LabelSelector(labelSelectorString) + serverRequest = serverRequest.LabelSelector(sb.String()) } sdkResponse, err := serverRequest.Execute() @@ -348,7 +352,6 @@ func convertSDKNICtoNIC(nic *iaas.NIC) *NIC { } } } - nic.GetId() return &NIC{ ID: getStringValue(nic.Id),